我一直试图全面了解这些多态关系。我可能会过于复杂/思考但是。 Laravel可以处理反多态关系吗?我有一个注册流程,可以有两种类型的字段模型 - 普通字段和customField。
当我遍历所有可用字段时,它可以从NormalField或CustomField中提取属性。
<?php
foreach($registrationFlow->fields->get() as $field)
{
echo $field->name; // could be custom field or could be normal field
}
?>
我的难点在于,如果您想将照片分配给员工或订单,文档中的the example given可以正常工作,但我想将customField或normalField分配给registrationFlow
*修改
如果你遵循example for the polymorphic many to many relationship,标签类包含帖子和视频 - 而我只想要一个简单的field()方法,它与customField或normalField相关,取决于类型
答案 0 :(得分:1)
首先,您应该查看Laravel 5.1的更新文档:https://laravel.com/docs/5.1/eloquent-relationships#polymorphic-relations。
我认为他们提供的示例存在的困难是Photo
和Staff
/ Product
之间的关系是&#34; has-a&#34;关系,而你正试图模拟一个&#34; is-a&#34;关系。但是,您可以建模&#34; is-a&#34;基本上是一样的。看一下这篇文章:http://richardbagshaw.co.uk/laravel-user-types-and-polymorphic-relationships/。
基本上,策略是定义与您的Field
相关的通用模型(和通用表),可能在您的情况RegistrationFlow
中。然后,您有两个子类型模型NormalField
和CustomField
,它们与Field
具有一对一的关系。 (那是你的&#34;是-a&#34;)。因此,RegistrationFlow
间接与您的字段子类型相关。
当您想要访问特定的子类型时,会出现多态性:
class Field extends Model {
public function fieldable()
{
return $this->morphTo();
}
}
您的基本field
表格应定义fieldable_id
和fieldable_type
个列(请参阅Eloquent文档)。
然后,您可以将方法添加到NormalField
和CustomField
,以便您访问基本模型(您的&#34;反向关系&#34;):
class NormalField {
public function field()
{
return $this->morphOne('Field', 'fieldable');
}
}
class CustomField {
public function field()
{
return $this->morphOne('Field', 'fieldable');
}
}
用法:
$field = Field::find(1);
// Gets the specific subtype
$fieldable = $field->fieldable;