2016-05-25 2 views
2

позволяет сказать, что у меня есть таблица orders, которая будет иметь отношение «многие ко многим» к трем другим таблицам с именем typings, translates и theses. Я знаю, что сводная таблица должна быть как-то вроде many to many polymorphic relation, но это не совсем то, что они ищут. Как мне выполнить сводную таблицу?Laravel: точка поворота таблицы для нескольких таблиц

+0

Не много ли многополиморфно, что вы loo король для? Это и есть цель этого отношения. – swatkins

+0

Хорошо, в отношении примера документации Laravel, пожалуйста, расскажите, как я могу получить доступ к связанным сообщениям через видео через много-много полиморфных и наоборот? и как насчет того, чтобы в дополнение к «посты» и «видео» была другая таблица с именем 'books'? – alex

+0

Я добавил реализацию в качестве ответа. В примере Laravel - сообщения не связаны с видео - они могут делиться только общими тегами. В этом случае вы можете получить теги из сообщения, а затем перебирать те, которые извлекают видео из каждого тега. – swatkins

ответ

1

Вы бы создать полиморфный отношения с заказами и трех других таблиц с помощью сводной таблицы с именем orderables

// TABLES NEEDED 
orders 
    id - integer 

typings 
    id - integer 

translates 
    id - integer 

theses 
    id - integer 

orderables 
    order_id - integer 
    orderable_id - integer 
    orderable_type - string 


// MODELS/RELATIONSHIPS NEEDED 
class Typing extends Model 
{ 
    public function orders() 
    { 
     return $this->morphToMany('App\Order', 'orderable'); 
    } 
} 
class Translate extends Model 
{ 
    public function orders() 
    { 
     return $this->morphToMany('App\Order', 'orderable'); 
    } 
} 
class Thesis extends Model 
{ 
    public function orders() 
    { 
     return $this->morphToMany('App\Order', 'orderable'); 
    } 
} 
class Order extends Model 
{ 
    public function typings() 
    { 
     return $this->morphedByMany('App\Typing', 'orderable'); 
    } 
    public function translates() 
    { 
     return $this->morphedByMany('App\Translate', 'orderable'); 
    } 
    public function theses() 
    { 
     return $this->morphedByMany('App\Thesis', 'orderable'); 
    } 
} 

Тогда вы могли бы получить заказы модели, как это:

$thesis = Thesis::find(1); 
$orders = $thesis->orders; 

И обратное:

$order = Order::find(1); 
$theses = $order->theses; 
+0

Спасибо, вы можете уточнить различия между 'morphMany',' morphToMany', 'morphByMany'? – alex

+0

'morphMany' - это метод определения полиморфного отношения« один ко многим ». Например, 'like' - предположим, что у нас есть модель« Post »и модель« Comment », и пользователь также должен« любить ». Ну, пользователь может только «Походить» на почту один раз, но она тоже может «понравиться» комментарию. – swatkins

+1

'morphToMany' и' morphByMany' определяют полиморфные отношения «многие-ко-многим». Например, «тег» - с использованием того же примера, что и выше, пользователь может «Отметить» сообщение «Почта» со многими тегами и может «Отметить» множество разных сообщений с теми же тегами. Она также может делать то же самое с «комментариями». – swatkins