2016-08-19 4 views
0

Мне нравится создавать полиморфные отношения, и я не уверен, что я делаю правильный путь в моем случае?Настройка полиморфных отношений?

У меня есть description_groups стол, и он принадлежит ко многим descriptions

В отношении к Laravel полиморфного отношения, таблица, такие как customers и orders может иметь много descriptions

Вот схема базы данных я придумал:

description_groups стол:

+----+----------------+ 
| id | name   | 
+----+----------------+ 
| 1 | Stock Movement | 
+----+----------------+ 

descriptions стол:

description_groups это относится ко многому descriptions перечисленного ниже

+----+----------------------+--------+ 
| id | description_group_id | name | 
+----+----------------------+--------+ 
| 1 |     1 | Name 1 | 
| 2 |     1 | Name 2 | 
| 3 |     1 | Name 3 | 
| 4 |     1 | Name 4 | 
+----+----------------------+--------+ 

Использования polymorphic_table таблицы можно определить, какие таблицы и запись может иметь описание. каково должно быть имя таблицы? Например:

+----+----------------+------------+----------+ 
| id | description_id | table_name | table_id | 
+----+----------------+------------+----------+ 
| 1 |    4 | customers |  2 | 
| 2 |    2 | orders  |  10 | 
+----+----------------+------------+----------+ 

customers table:

+----+-----------------+ 
| id | name   | 
+----+-----------------+ 
| 1 | Customer Name 1 | 
| 2 | Customer Name 2 | 
| 3 | Customer Name 3 | 
+----+-----------------+ 

Так это значит Customer Name 2 есть Name 4 описание входа, которое принадлежит Stock Movement записи.

+0

имя таблицы не должно быть таблица, она должна быть путь к модели, представляющей таблицу. 'App \ Customer' и' App \ Order' в порядке. Кроме того, не следует называть 'table_name', но' entity_name' и 'table_id' также должны быть' entity_id'. Чище, более прямолинейно, следует прагма дизайна Laravel. – Ohgodwhy

+0

@Ohgodwhy Спасибо, не стесняйтесь публиковать свой ответ. 'описания' и' description_groups' отлично смотрятся на вас? –

ответ

1

Laravel имеет встроенную поддержку полиморфных отношений, в которой вы можете найти более here.

Я действительно не понимаю, почему вы настроили свою схему так, как вы это делали, но я так делаю, чтобы клиенты и заказы могли иметь описания.

descriptions (<id>, name, content, describable_type, describable_id) 
customers (<id>, name) 
orders (<id>, items) 

Обратите внимание, что descriable_type является строкой, и descriable_id представляет собой целое число без знака.

Далее вам нужно будет установить связь, как описано в документации (обратите внимание на комментарии, которые говорят вам, какой файл модели они принадлежат):

// In App\Description 
public function describable() 
{ 
    return $this->morphTo();  
} 

// In App\Customer 
public function descriptions() 
{ 
    return $this->morphMany('App\Description', 'describable'); 
} 

// In App\Orders 
public function descriptions() 
{ 
    return $this->morphMany('App\Description', 'describable'); 
} 

Теперь, вот одна вещь, что документы Laravel не упоминать; взаимно-однозначная полиморфная связь создается так же, как взаимно-однозначная нормальная связь, тогда как полиморфное отношение «один ко многим» создается так же, как нормальное отношение «один ко многим» ... (просто думать о morphTo как полиморфного belongsTo)

так, чтобы использовать это:

// be sure to set the correct $guarded access before using create() 
$description = Description::create(['name' => 'Name', 'content' =>'Lorem Ispum"; 
$customer = Customer::create(['name' => 'Customer 1']); 
$customer->describable()->associate($description); 
$customer->save(); 
+0

Большое спасибо @ Extrakun.Это было очень полезно. Я не понимаю, зачем нам 'descriable_id', когда у нас есть' description.id'. Таблица 'описания' подобна предопределенному списку, который связан с таблицей' description_groups'. Поэтому в основном, если пользователь выбирает 'Stock Movement' из группы, а затем отображает список описаний. Пользователь выбирает любой из списка описания, а затем сохраняет в свод. Имеют смысл? –

+0

«Описание» не относится к описанию, а скорее описывает описание. Таким образом, это относится либо к клиенту, либо к заказу в вашем случае. Descriptionable_id - это идентификатор клиента или его заказ, и описываемый_type хранит, является ли это клиентом или заказом. – Extrakun

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