2016-03-25 2 views
0

Весь день я пытаюсь обмануть эти полиморфные отношения. Возможно, я слишком усложняюсь/размышляю об этом. Может ли 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, класс тег содержит сообщения и videos- в то время как я хотел бы только простые поля() метод, который относится к customField или normalField зависит от типа

+0

Я не понимаю разницы ? Я не уверен, что вы подразумеваете под «перевернутыми полиморфными отношениями», не могли бы вы быть более ясными? – ollieread

+0

, если вы будете следовать официальному примеру, я бы хотел что-то вроде $ photos-> items - я думаю, что писать этот ответ получил яснее в моей голове –

+0

Я думаю, я объяснил это лучше –

ответ

1

Прежде всего, вы должны взглянуть на обновленные документы для Laravel 5.1: https://laravel.com/docs/5.1/eloquent-relationships#polymorphic-relations.

Я думаю, что трудность с примером они обеспечивают то, что отношения между Photo и Staff/Product являются «Хас-а» отношения, в то время как вы пытаетесь смоделировать «это-» отношения. Тем не менее, вы можете моделировать «is-a», по сути, одинаково. Взгляните на эту статью: http://richardbagshaw.co.uk/laravel-user-types-and-polymorphic-relationships/.

В принципе, стратегия заключается в определении общей модели (и общей таблицы), возможно, в вашем случае Field, что относится к вашему RegistrationFlow. Затем у вас есть две модели подтипов: NormalField и CustomField, которые имеют взаимно-однозначные отношения с Field. (есть ваш «есть-а»). Таким образом, RegistrationFlow является косвенно относящимся к вашим подтилям поля.

полиморфизм приходит, когда вы хотите получить доступ к конкретным подтипы:

class Field extends Model { 

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

Ваша база field таблица должна иметь fieldable_id и fieldable_type столбцы, определенные (см красноречивым документы).

Вы можете добавить методы NormalField и CustomField, что позволит вам получить доступ к базовой модели (ваш «обратная зависимость»):

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; 
Смежные вопросы