amethyst/relation-schema

v0.3.3 2024-04-05 10:59 UTC

README

Action Status Amethyst

在不更改代码的情况下,自定义 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: 关系的类型。值:BelongsToHasManyHasOneMorphToMorphToManyMorphToOneMorphMany
  • data: 该关系开始的数据名称。例如,如果通过名为 authorBelongsTo 关系将 BookAuthor 关联,则 book 是数据
  • payload: 一组信息,用于更好地定义关系,这取决于关系的类型。例如,在 BelongsTo 关系中,您需要一个目标,在上面的示例中,Author 是目标。

在引用任何模型时,我们将通过名称来调用它。例如,\App\Models\Customer 将是 customer更多信息

请注意,这是一个 Amethyst 包,如果您想查看可用的全部功能和自定义选项,请检查 core

关系

如前所述,根据 type 属性,payload 必须有不同的值集。它使用 Yaml 进行序列化,因此对于所有示例,我们将使用 Symfony\Component\Yaml\Yaml 将数组转换为 Yaml。

大多数关系都使用 Laravel 定义的命名约定,例如 foreignKeyownerKey

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 之外,您还可以设置 foreignKeylocalKey

现在让我们看一下在 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');
	}
}

但是等等,还有更多!您可以创建具有自定义子筛选器的关联。例如,如果您有一个 customerinvoice,您想要创建一个关系,检索所有 invoicesstatus 为: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