ibrostudio/laravel-data-repository

这是我创建的包laravel-data-repository

1.4.0 2024-09-22 04:15 UTC

This package is auto-updated.

Last update: 2024-09-22 04:16:22 UTC


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模型中。

该特性实现了一个扩展MorphManyMorphManyDataObjects关系。

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)。有关更多信息,请参阅许可证文件