amethyst / relation-schema
Requires
- php: >=8.2
- amethyst/core: 0.3.*
- amethyst/relation: 0.3.*
Requires (Dev)
- amethyst/foo: 0.3.*
- friendsofphp/php-cs-fixer: ^3.52
- orchestra/testbench: *
README
在不更改代码的情况下,自定义 Eloquent 模型之间的关系。
需求
- PHP 8.2 及以上版本
安装
您可以通过 Composer 安装它,输入以下命令
composer require amethyst/relation-schema
该包将自动注册自己。
初始化
在任意 ServiceProvider 的 boot 方法中添加 app('amethyst.relation-schema')->boot();
用法
简单的用法如下
use Symfony\Component\Yaml\Yaml; app('amethyst')->get('relation-schema')->createOrFail([ 'name' => 'parent', 'type' => 'BelongsTo', 'data' => 'foo', 'payload' => Yaml::dump([ 'target' => 'bar', ]), ]);
以下是一个所有属性的列表及其简要说明
- name: 关系名称。可以是字母数字,并且必须以字母开头
- description: 可选字段,将有助于描述关系
- type: 关系的类型。值:
BelongsTo、HasMany、HasOne、MorphTo、MorphToMany、MorphToOne、MorphMany - data: 该关系开始的数据名称。例如,如果通过名为
author的BelongsTo关系将Book与Author关联,则book是数据 - payload: 一组信息,用于更好地定义关系,这取决于关系的类型。例如,在
BelongsTo关系中,您需要一个目标,在上面的示例中,Author是目标。
在引用任何模型时,我们将通过名称来调用它。例如,\App\Models\Customer 将是 customer。 更多信息
请注意,这是一个 Amethyst 包,如果您想查看可用的全部功能和自定义选项,请检查 core
关系
如前所述,根据 type 属性,payload 必须有不同的值集。它使用 Yaml 进行序列化,因此对于所有示例,我们将使用 Symfony\Component\Yaml\Yaml 将数组转换为 Yaml。
大多数关系都使用 Laravel 定义的命名约定,例如 foreignKey 或 ownerKey。
BelongsTo
从最简单的关系 BelongsTo 开始。它只需要一个 target 参数,该参数指示我们关联到哪个模型。
您还可以设置 foreignKey 选项。
因此,例如这个新记录
use Symfony\Component\Yaml\Yaml; app('amethyst')->get('relation-schema')->createOrFail([ 'name' => 'parent', 'type' => 'BelongsTo', 'data' => 'foo', 'payload' => Yaml::dump([ 'target' => 'bar', 'foreignKey' => 'foreign_key' ]) ]);
与以下内容完全相同
use Illuminate\Database\Eloquent\Relations\BelongsTo; class Foo { public function parent(): BelongsTo { return $this->belongsTo(Bar::class, 'foreign_key'); } }
HasMany 和 HasOne
BelongsTo 的反向关系。它们的行为完全相同。
除了 target 之外,您还可以设置 foreignKey 和 localKey。
现在让我们看一下在 BelongsTo 中相同关系的反向示例
use Symfony\Component\Yaml\Yaml; app('amethyst')->get('relation-schema')->createOrFail([ 'name' => 'children', 'type' => 'HasMany', 'data' => 'bar', 'payload' => Yaml::dump([ 'target' => 'foo', 'foreignKey' => 'foreign_key', 'localKey' => 'local_key' ]), ]);
将得到以下结果
use Illuminate\Database\Eloquent\Relations\HasMany; class Bar { public function children(): HasMany { return $this->belongsTo(Foo::class, 'foreign_key', 'local_key'); } }
但是等等,还有更多!您可以创建具有自定义子筛选器的关联。例如,如果您有一个 customer 和 invoice,您想要创建一个关系,检索所有 invoices 的 status 为:paid 的客户。
您可以在 payload 中添加另一个参数 filter。
因此,像这样:filter: "status eq 'paid'"。您还可以在这里使用自动连接,例如,查询:只包含名称中包含 Maintenance 的发票,将得到 filter: "status eq 'paid' and items.name ct 'Maintenance'"。
限制:您不能在筛选器中插入正在定义的同一关系
ManyToMany 和 BelongsToMany
尚未实现。
MorphTo
类似于BelongsTo,它不需要target,而是需要一个foreignKey,在这种情况下指的是字段的名称
多态多对多(MorphToMany)和多态一对一(MorphToOne)
正在进行中(WIP)
多态多对多(MorphMany)
正在进行中(WIP)
API
此包中没有额外的路由,只有由核心提供的默认路由。
测试
- 克隆此仓库
- 将默认的
phpunit.xml.dist复制到phpunit.xml - 根据需要更改环境变量
- 运行
./vendor/bin/phpunit