如何处理倒置的多态关系?

时间:2016-03-25 11:56:35

标签: laravel eloquent

我一直试图全面了解这些多态关系。我可能会过于复杂/思考但是。 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相关,取决于类型

1 个答案:

答案 0 :(得分:1)

首先,您应该查看Laravel 5.1的更新文档:https://laravel.com/docs/5.1/eloquent-relationships#polymorphic-relations

我认为他们提供的示例存在的困难是PhotoStaff / 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中。然后,您有两个子类型模型NormalFieldCustomField,它们与Field具有一对一的关系。 (那是你的&#34;是-a&#34;)。因此,RegistrationFlow 间接与您的字段子类型相关。

当您想要访问特定的子类型时,会出现多态性:

class Field extends Model {

    public function fieldable()
    {
        return $this->morphTo();
    }
}

您的基本field表格应定义fieldable_idfieldable_type个列(请参阅Eloquent文档)。

然后,您可以将方法添加到NormalFieldCustomField,以便您访问基本模型(您的&#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;