tschallacka/storm-inherit-relations

WinterCMS Storm 库数据库模型的简单依赖,允许继承父模型中定义的关系

v1.0.0 2021-09-19 15:54 UTC

This package is auto-updated.

Last update: 2024-09-19 23:01:42 UTC


README

此插件为基于WinterCMS Storm 库的数据库模型提供了一种行为。

默认情况下,当你扩展基模型时,你将丢失父模型中定义的所有关系。在某些情况下,你不想丢失对这些关系的访问权限,而是想改进它,继续对核心概念进行工作,在继承树向上添加功能时,所需的对象会有所不同。

例如(如果你只想知道如何使用它,请跳过)

在 Magento 中,你有 AttributeValues。每个属性值都有一个与 AttributeName 的关系。
这将是一个基模型,具有 belongsTo 关系,我们将其称为 AttributeValue

然后,一个值可以属于不同类型的模型。例如 ProductQuoteCustomer 等...
属于一种类型的值不能属于另一种类型,我们将其称为 OwnedBy[Type]
这将是一个扩展 AttributeValueModel,向其中添加对“所有者类型”的 $belongsTo 关系

然后有多个不同的数据类型,每个类型都存储在自己的表中(不要问为什么,Magento 选择这种方法)
因此,整数值有自己的表,datetime 值有自己的表,小数有自己的表,等等...
这些值类型将扩展 OwnedBy[Type],只更改存储值的表名。
我们将称之为 OwnedBy[Type][ValueType]。如果你做数学运算,你可以看到这会产生大量的文件来生成和修改。

替代方案

这是一个在整个层中从父关系继承的理想用例。
当然,你可以修改构造函数以从父类中读取数据,并将其添加到当前类中。
这意味着你需要复制粘贴这段代码大约 25 次,这不会很 DRY

我的解决方案

我是一个程序员,我很懒,不喜欢一遍又一遍地复制粘贴相同的内容。我建议有一个可以注入到你认为需要它的类中的实现。
例如,最基础的类 AttributeValue,这确保了所有子类都有它,而且不需要一遍又一遍地复制粘贴。

使用关系继承。

安装

composer require tschallacka/storm-inherit-relations ^1.0

用法

在你想获取父类中定义的关系的模型中,将此添加到你的 $implements 数组中

public $implement = [\Tschallacka\StormInheritRelations\Behavior\InheritRelations];

模型示例

<?php
namespace Tschallacka\Example\Attribute;

use Winter\Storm\Database\Model;
use Tschallacka\StormInheritRelations\Behavior\InheritRelations;

class AttributeValue extends Model
{
    public $primaryKey = 'value_id';

    public $implement = [
        InheritRelations::class
    ];

    public $belongsTo = [
        'attribute' => AttributeName::class,
    ];
}