Фабрика Laravel 8: полиморфные отношения «один ко многим»

Чтобы установить полиморфную связь «один ко многим» с помощью фабрик Laravel 8, вы можете выполнить следующие шаги:

Шаг 1. Определите таблицы базы данных
Создайте необходимые таблицы базы данных для полиморфных отношений. В этом примере предположим, что у нас есть три таблицы: сообщения, видеои комментарии. Как публикации, так и видеомогут иметь несколько комментариев.

Шаг 2. Определите модели.
Создайте модели для каждой таблицы: Публикация, Видеои Комментарий. За полиморфные отношения будет отвечать модель Comment.

Шаг 3. Определите связи
В модели Commentопределите полиморфные отношения с таблицами postsи videos, используя метод Метод morphTo:

class Comment extends Model
{
    public function commentable()
    {
        return $this->morphTo();
    }
}

В моделях Postи Videoопределите обратную связь с помощью метода morphMany:

class Post extends Model
{
    public function comments()
    {
        return $this->morphMany(Comment::class, 'commentable');
    }
}
class Video extends Model
{
    public function comments()
    {
        return $this->morphMany(Comment::class, 'commentable');
    }
}

Шаг 4. Определите фабрики.
Создайте фабрики для каждой модели (PostFactory, VideoFactory, CommentFactory). Вот пример PostFactoryс полиморфным отношением один-ко-многим:

use App\Models\Post;
use App\Models\Comment;
$factory->define(Post::class, function (Faker $faker) {
    return [
        'title' => $faker->sentence,
        'content' => $faker->paragraph,
    ];
});
$factory->afterCreating(Post::class, function ($post, $faker) {
    $post->comments()->saveMany(factory(Comment::class, 3)->make());
});

В этом примере после создания Postмы используем метод afterCreating, чтобы связать с ним три модели Commentс помощью saveMany.

Шаг 5. Создайте начальные данные
Чтобы сгенерировать начальные данные, запустите программу раздачи базы данных:

php artisan db:seed

Это заполнит таблицы posts, videosи commentsпримерами данных.