ibrostudio/laravel-data-repository
这是我创建的包laravel-data-repository
1.4.0
2024-09-22 04:15 UTC
Requires
- php: ^8.2
- illuminate/contracts: ^11.0
- michael-rubel/laravel-value-objects: ^7.0
- spatie/laravel-data: ^4.0
- spatie/laravel-package-tools: ^1.14.0
Requires (Dev)
- larastan/larastan: ^2.0.1
- laravel/pint: ^1.0
- nunomaduro/collision: ^8.0
- orchestra/testbench: ^9.0
- pestphp/pest: ^2.20
- pestphp/pest-plugin-arch: ^2.0
- pestphp/pest-plugin-laravel: ^2.0
- pestphp/pest-plugin-type-coverage: ^2.8
- phpstan/extension-installer: ^1.1
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-phpunit: ^1.0
README
保存数据传输对象(来自Spatie的Laravel Data)和价值对象(来自Michael Rubel的Laravel Value Objects)到数据库并附加到Eloquent模型。
安装
使用composer安装此包
composer require ibrostudio/laravel-data-objects-repository
然后运行安装程序
php artisan data-repository:install
使用方法
将特性IBroStudio\DataRepository\Concerns\HasDataRepository
添加到你的Eloquent模型中。
该特性实现了一个扩展MorphMany
的MorphManyDataObjects
关系。
namespace App\Models; use IBroStudio\DataRepository\Concerns\HasDataRepository; use Illuminate\Database\Eloquent\Model; class YourEloquentModel extends Model { use HasDataRepository; }
处理DTO
根据Spatie的Laravel Data 文档创建你的DTO。
namespace App\DataObjects; use Spatie\LaravelData\Data; class SongData extends Data { public function __construct( public string $title, public string $artist, ) { } }
$data = new SongData( title: 'Walk', artist: 'Pantera' );
处理值对象
使用内置的值对象或根据Michael Rubel的值对象 文档创建一个。
$data = new \MichaelRubel\ValueObjects\Collection\Complex\Name('Pantera');
保存附加到模型的值对象到数据库
$model->data_repository()->add($data);
对于更复杂的用法,你可以在DTO中使用值对象
namespace App\DataObjects; use Spatie\LaravelData\Data; use MichaelRubel\ValueObjects\Collection\Complex\Name; class SongData extends Data { public function __construct( public Name $title, public Name $artist, ) { } }
创建或更新对象
以下方法将对象保存到数据库并将其附加到模型
$model->data_repository()->add($data);
如果模型已经有一个无数据类的对象附加,其值将被替换。
唯一的数据类
你可以将许多对象附加到模型,但默认情况下每个数据类只能有一个。考虑到前面的示例,模型只能有一个SongData对象(和其他DTO或值对象)。
多个数据类
如果你需要同一个数据类的多个对象,在创建或更新对象时使用valuesAttributes
参数
$song1 = new SongData( title: 'Walk', artist: 'Pantera' ); $model->data_repository()->add($data); $song2 = new SongData( title: 'Cowboys From Hell', artist: 'Pantera' ); $model->data_repository()->add( data: $song2, valuesAttributes: [ 'values->title' => $song2->title, ] ); $song3 = new SongData( title: 'Davidian', artist: 'Machine Head' ); $model->data_repository()->add( data: $song3, valuesAttributes: [ 'values->artist' => $song3->artist, ] );
检索对象
你可以使用以下方式访问模型的全部MorphManyDataObjects
关系
$model->data_repository();
你可以限制实例以访问特定数据类的单个对象
$model->data_repository(dataClass: SongData::class);
然后通过values()
方法检索对象
$song = $model->data_repository(dataClass: SongData::class)->values();
如果需要,你也可以使用valuesQuery
参数将对象检索限制为该对象的一些特定值
$model->data_repository( dataClass: SongData::class, valuesQuery: ['title' => 'Walk'] );
测试
composer test
更新日志
请参阅更新日志以获取有关最近更改的更多信息。
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。