Premise
Я создаю небольшое приложение с профилями пользователей, в котором можно разместить список элементов разных типов.
Каждый Item
может быть Link
, Card
, Video
. Таким образом, каждый макет можно оптимизировать соответствующим образом. Немного похоже на Tumblr, если хотите.
Настройка
По этой причине я решил использовать однозначное отношение полиморфизм c (может быть, излишнее?) , с таблицей items
с дополнительными столбцами, например position
(чтобы пользователь мог изменить порядок элементов).
Таблица items
:
id
user_id (foreign key)
itemable_id
itemable_type
position
...
Мои модели выглядят так:
Item
модель
public function itemable()
{
return $this->morphTo();
}
public function user()
...
Link
модель
public function item()
{
return $this->morphOne('\App\Item', 'itemable');
}
public function user()
...
Card
модель
public function item()
{
return $this->morphOne('\App\Item', 'itemable');
}
public function user()
...
… и так далее для других Item
типов.
Наконец, в ItemController
я создаю фиктивная ссылка для целей отладки:
// ...
$newLink = new Link();
$newLink->url = 'example.org';
$newLink->title = 'Example Website NEW';
$newLink->user_id = $user->id;
$user->items()->save($newLink);
// ...
Но, в отличие от того, как я ожидал, новая запись в таблице items
не создается. Я должен сделать это сам, вручную, как только я сохраню ссылку $newLink
.
Вопрос
Это нормально? Я ожидал получить Link
(с itemable_id
и itemable_type
, созданными автоматически.
Если так, мне определенно что-то здесь не хватает. Как я могу заставить Laravel создать items
вход автоматически?