Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/kolirt/laravel-master-model
🧖♂️ Package that simplifies working with models, saving relationships, and uploading files in Laravel
https://github.com/kolirt/laravel-master-model
laravel-file-manager laravel-file-upload laravel-model laravel-package laravel-relationship
Last synced: about 1 month ago
JSON representation
🧖♂️ Package that simplifies working with models, saving relationships, and uploading files in Laravel
- Host: GitHub
- URL: https://github.com/kolirt/laravel-master-model
- Owner: kolirt
- License: mit
- Created: 2019-02-08T21:22:24.000Z (almost 6 years ago)
- Default Branch: master
- Last Pushed: 2024-09-11T09:41:02.000Z (4 months ago)
- Last Synced: 2024-10-11T15:38:08.036Z (3 months ago)
- Topics: laravel-file-manager, laravel-file-upload, laravel-model, laravel-package, laravel-relationship
- Language: PHP
- Homepage:
- Size: 18.6 KB
- Stars: 3
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Funding: .github/FUNDING.yml
- License: LICENSE.txt
Awesome Lists containing this project
README
# Laravel Master Model
Laravel Master Model is a powerful package for the Laravel framework that simplifies working with models, particularly
in **saving relations** and **uploading files**.This package is designed for developers who want to optimize the process of working with databases and files, reducing
code complexity and enhancing performance.## Structure
- [Getting started](#getting-started)
- [Requirements](#requirements)
- [Installation](#installation)
- [Setup](#setup)
- [Console commands](#console-commands)
- [Use cases](#use-cases)
- [Saving files](#saving-files)
- [Saving files from third-party resources](#saving-files-from-third-party-resources)
- [Deleting files](#deleting-files)
- [Saving `HasOne`, `MorphOne` relations](#saving-hasone-morphone-relations)
- [Saving `HasMany`, `MorphMany` relations](#saving-hasmany-morphmany-relations)
- [Saving `HasMany`, `MorphMany` relations with `sync` mode](#saving-hasmany-morphmany-relations-with-sync-mode)
- [Saving `BelongsToMany` relation](#saving-belongstomany-relation)
- [Saving `BelongsToMany` relation with `sync` mode](#saving-belongstomany-relation-with-sync-mode)
- [Response file](#response-file)
- [FAQ](#faq)
- [License](#license)
- [Other packages](#other-packages)## Getting started
### Requirements
- PHP >= 8.1
- Laravel >= 10### Installation
```bash
composer require kolirt/laravel-master-model
```### Setup
Publish config file```bash
php artisan master-model:install
```Use the `MasterModel` trait in your models
```php
use Kolirt\MasterModel\MasterModel;class Item extends Model
{
use MasterModel;
}
```## Console commands
- `master-model:install` - Install master model package
- `master-model:publish-config` - Publish the config file## Use cases
### Saving files
```php
class Item extends Model
{
use MasterModel;protected $fillable = [
'image',
];
}
```MasterModel automatically saves the file and deletes the old file, if it existed
```php
class ExampleController extends Controller
{
public function index(Request $request, $id)
{
$data = $request->validate([
'image' => 'required|file',
]);$item = Item::query()->findOrFail($id);
$item->update($data);
}
}
```You can specify folder and disk for each file
```php
class Item extends Model
{
use MasterModel;protected $fillable = [
'image',
];
protected string $upload_model_folder = 'items';protected array $upload_folders = [
'image' => 'image',
];protected array $upload_disks = [
'image' => 'public'
];
}
```### Saving files from third-party resources
You no longer need to worry about saving files from third-party resources, just put the `response` and MasterModel will save everything for you```php
class ExampleController extends Controller
{
public function index($id)
{
$file1_url = 'https://png.pngtree.com/png-clipart/20230126/original/pngtree-fresh-red-apple-png-image_8930987.png';
$response = \Illuminate\Support\Facades\Http::get($file1_url);$file2_url = 'https://cubanvr.com/wp-content/uploads/2023/07/ai-image-generators.webp';
$client = new \GuzzleHttp\Client();
$response2 = $client->get($file2_url);Item::create([
'image' => $response,
'image2' => $response2
]);
}
}
```### Deleting files
You can delete files by setting the field to `null````php
$item = Item::query()->first();$item->update([
'image' => null
]);
```To have files deleted automatically, delete data through the model, not through the builder, and don't forget to load the necessary relations in which you want to delete files
_If there are files in the relationship and the relationship is deleted not through the model, the files won't be deleted and will clog up storage_
```php
$item = Item::query()->with(['phone', 'addresses'])->first();
/**
* All files in the model and in the loaded relations will be deleted
*/
$item->delete();
```### Saving `HasOne`, `MorphOne` relations
You can **save** `HasOne`, `MorphOne` relations in the same way as a file. If relation exists, it will be updated, otherwise it will be created```php
$item = Item::query()->first();$item->update([
'phone' => [ // hasOne, morphOne relation
'number' => '1234567890'
]
]);
```You can also **delete** the relation by setting it to `null`
```php
$item = Item::query()->first();$item->update([
'phone' => null // hasOne, morphOne relation
]);
```### Saving `HasMany`, `MorphMany` relations
You can **save** `HasMany`, `MorphMany` relations in the same way as a file. If relations exists, it will be updated, otherwise it will be created```php
$item = Item::query()->first();$item->update([
'phones' => [ // hasMany, morphMany relations
[ // will be created
'number' => '1234567890'
],
[ // will be updated (id = 1)
'id' => 1,
'number' => '0987654321'
]
]
]);
```### Saving `HasMany`, `MorphMany` relations with `sync` mode
You can also **sync** `HasMany`, `MorphMany` relations. Unspecified relations will be deleted```php
$item = Item::query()->first();$item->update([
'phones' => [ // hasMany, morphMany relations
'mode' => 'sync', // not specified relations will be deleted
'value' => [
[ // will be created
'number' => '1234567890'
],
[ // will be updated (id = 1)
'id' => 1,
'number' => '0987654321'
]
]
]
]);
```### Saving `BelongsToMany` relation
```php
$item = Item::query()->first();$item->update([
'categories' => [1, 2, 3] // belongsToMany relations
]);$item->update([
'categories' => [ // belongsToMany relation
1 => ['name' => 'Category 1'],
2 => ['name' => 'Category 2'],
3 => ['name' => 'Category 3']
]
]);
```### Saving `BelongsToMany` relation with `sync` mode
You can **sync** the `BelongsToMany` relation. Everything that is not specified when saving will be deleted```php
$item = Item::query()->first();$item->update([
'categories' => [ // belongsToMany relation
'mode' => 'sync', // not specified relations will be deleted
'value' => [1, 2, 3]
]
]);$item->update([
'categories' => [ // belongsToMany relation
'mode' => 'sync', // not specified relations will be deleted
'value' => [
1 => ['name' => 'Category 1'],
2 => ['name' => 'Category 2'],
3 => ['name' => 'Category 3']
]
]
]);
```### Response file
Use the `responseFile` method to return a file in a controller```php
class FileController extends Controller
{public function index()
{
$item = Item::query()->first();
return $item->responseFile('image');
}}
```## FAQ
Check closed [issues](https://github.com/kolirt/laravel-master-model/issues) to get answers for most asked questions## License
[MIT](LICENSE.txt)## Other packages
Check out my other packages on my [GitHub profile](https://github.com/kolirt)