Создать новую запись (отношение «Один к одному полиморфу c») - PullRequest
0 голосов
/ 25 мая 2020

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.

Вопрос

Это нормально? Я ожидал получить Linkitemable_id и itemable_type, созданными автоматически.

Если так, мне определенно что-то здесь не хватает. Как я могу заставить Laravel создать items вход автоматически?

1 Ответ

0 голосов
/ 25 мая 2020

используйте associate так, как показано ниже:

$user->items()->associate($newLink);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...