【问题标题】:polymorphic laravel morphTo?多态laravel morphTo?
【发布时间】:2021-09-30 17:54:34
【问题描述】:

我想创建一个有点多态的 laravel morphTo。

我想创建多个“维度”多态属性,但没有必要为它们的值(宽度、长度、高度、重量)创建四个单独的(相同的)表。

问题是,我只是偶然发现了它是如何创建链接的,我不太确定如何指定维度的类型。

我正在考虑创建一个抽象的“维度”模型,然后用继承的“宽度”、“长度”、“高度”和“重量”模型包装它,这些模型将在调用父 __constructor($属性)

我以为我找到了解决方案,但它似乎不起作用。我在我的 Width() 类(继承自 DimensionAbstract)中创建了一个“widthable”方法,并分别为其命名和 id 字段“dimensionable_name”、“dimensionable_id”。例如:

public function widthable()
{
    return $this->morphTo(__FUNCTION__, 'dimensionable_type', 'dimensionable_id');
}

但它抱怨未找到 widthable_id 列。是否有某种方法可以键入一个 morphOne(或相同的伪变体)取决于 morphed 类的属性之一? (在我的例子中,我使用一个枚举来表示“轴”,它可以包括“宽度”、“长度”、“高度”或“重量”——然后我在构造函数中设置了该属性) 我试图在其他每个继承的类中为长度、高度和重量做类似的事情。

【问题讨论】:

    标签: php laravel eloquent polymorphism polymorphic-associations


    【解决方案1】:

    据我所知,您有一个名为 dimensions 的表,并且您想动态使用 id。 为什么不创建一个名为 Dimension 的模型,而不是为 WidthLengthHeight 创建其他单独的模型和 Weight 将扩展该 Dimension 模型,并且在每个扩展 Dimension 的模型上使用您在 axis 例如。 ->where('axis', 'width'),并在每个模型中创建一个函数,例如setAxisAttribute(),根据模型将轴设置为相应的值:

    public function setAxisAttribute($value)
    {
        $this->attributes['axis'] = 'width';
    }
    

    或者我没有正确理解你。

    【讨论】:

    • 我发现了问题所在。我还需要在 morphOne 端定义类型和键。 (文档并不清楚)。但现在这让我想到了另一个问题。我对每种类型的功能都非常相似。在某些情况下,它们似乎依赖于某些属性的函数名称。我现在覆盖了这两个,但我需要检查是否有其他方法使用函数名称。我更愿意为那些使用魔术方法。
    【解决方案2】:

    在深入跟踪代码之后,我终于弄清楚了我需要什么(这是我一半的预期)。要使用不同的键,我还需要在 morphOne 端以及逆 morphTo 端定义它们。然后在从许多中提取实际上是一个变形的结果时找到匹配的那个(文档对此并不清楚)。例如:

    public function width()
    {
        return $this->morphOne(Height::class, __FUNCTION__.'able', 'dimensionable_type', 'dimensionable_id')->where('axis', __FUNCTION__);
    }
    

    我也有一个类似的(实际的)morphOne 用于定价信息。目前它仍然足够基本,它可以在技术上得到相同框架的支持,但我想在定价中添加额外的方法行为,例如让值代表一个百分比,该百分比可以用作子组件总价的修饰符. (例如,选择选项“a”并获得 10% 的折扣)

    我现在在想,对于这些基本的键/值/单元属性,我可以将它们包装在一个单一的“维度”类中,然后使用一种神奇的方法来处理 morphOne(从技术上讲是多对-one) 关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-05
      • 2014-12-01
      • 2017-09-22
      • 2013-10-08
      • 2018-09-17
      • 1970-01-01
      • 2023-02-17
      相关资源
      最近更新 更多