首页 > 解决方案 > 多态laravel morphTo?

问题描述

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

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

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

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

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

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

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

标签: phplaraveleloquentpolymorphismpolymorphic-associations

解决方案


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

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

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

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


推荐阅读