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