2013-04-19 11 views
3

У меня есть 3 модели, статья, здание, человек.Полиморфные отношения со сводной таблицей в Ларавеле?

  1. Эти модели должны ссылаться друг на друга несколькими способами. Например, здание должно иметь возможность ссылаться на коллекции Person, такие как $ building-> architects(), $ building-> owner(), статья может ссылаться на коллекции Person with $ article-> authors(), а Person может ссылаться на коллекции здания типа $ person-> owned_buildings()

  2. Каждая модель должна иметь функцию типа «ссылки», чтобы получить коллекцию смешанных моделей.

Я думаю, что это должно быть возможно что-то вроде:

class Article extends Eloquent { 
    public function referenceable() 
    { 
     return $this->morphTo(); 
    } 

    public function authors() 
    { 
     return $this->morphMany('Person', 'referenceable'); 
    } 
} 

class Building extends Eloquent { 
    public function referenceable() 
    { 
     return $this->morphTo(); 
    } 

    public function architects() 
    { 
     return $this->morphMany('Person', 'referenceable'); 
    } 
} 

class Person extends Eloquent { 
    public function referenceable() 
    { 
     return $this->morphTo(); 
    } 

    public function owned_buildings() 
    { 
     return $this->morphMany('Building', 'referenceable'); 
    } 
} 

Таким образом, вопрос, что бы в сводной таблице выглядеть?

+0

Эта функция в пути. https://github.com/laravel/framework/issues/2032 –

ответ

1

Полиморфные отношения - это в основном отношения «один ко многим». Они позволяют повторно использовать модель для многих других моделей.

Например, если Post имеет много изображений, а у Пользователя может быть много аватаров, вы можете использовать одни и те же модели изображений без конфликтов. Поэтому вместо установки изображения с полем user_id и поле post_id вы можете использовать общий файл imageable_id.

Вам понадобится много-ко-многим, которые в настоящее время не поддерживается с morphMany красноречивы (в)

Вы можете сделать несколько типов сводных таблиц для этого. Например, создайте две таблицы создания архива/здания и владельца/здания отдельно по полям building_id и person_id. Или вы можете настроить один поворотный стол с дополнительной «типа» поле для определения роли

+0

Хорошо, если я настрою building_persons и хочу использовать поле типа, которое может быть, например, «архитектором» и «владельцем», как бы определить, что с правкой? –

7

можно определить belongsTo используя morphMany-style отношения путем добавления where к смеси:

public function followers() { 
    return $this 
     ->belongsToMany('User', 'follows', 'followable_id', 'user_id') 
     ->where('followable_type', '=', 'Thing'); 
    } 

where будет просто убедиться, что Eloquent не соответствует разным идентификаторам.

Надеюсь, что это поможет!

+0

Laravel 4.1 теперь поддерживает взаимно-однозначные и однонаправленные полиморфные отношения. http://laravel.com/docs/eloquent#polymorphic-relations – dwenaus

Смежные вопросы