Урок 09

Связи в сидерах и фабриках

Создание связанных данных — частая задача при сидировании.

Создание через связь

$user = User::factory()->create();

$user->posts()->create([
    'title' => 'Пост пользователя',
    'body' => 'Текст',
]);

Many-to-many

$post = Post::factory()->create();
$tags = Tag::factory()->count(3)->create();

$post->tags()->attach($tags->pluck('id'));

Фабрика с вложенной связью

Post::factory()
    ->has(Comment::factory()->count(5))
    ->create();

Создаст пост и 5 комментариев к нему.

Множество вложенных

Post::factory()
    ->has(Comment::factory()->count(5)->has(Like::factory()->count(2)))
    ->create();

Цикл по постам

User::factory()
    ->count(10)
    ->has(Post::factory()->count(5))
    ->create();

Создаст 10 пользователей, у каждого 5 постов.

Полиморфные связи

$post = Post::factory()->create();

Comment::factory()
    ->for($post, 'commentable')
    ->count(3)
    ->create();

Many-to-many через фабрику

Post::factory()
    ->hasAttached(Tag::factory()->count(3))
    ->create();

Существующие модели

Если нужно привязать к существующим:

$users = User::factory()->count(5)->create();

Post::factory()
    ->count(20)
    ->recycle($users)
    ->create();

recycle переиспользует модели вместо создания новых.

Сидер с полной структурой

public function run(): void
{
    User::factory()
        ->count(10)
        ->has(Post::factory()->count(5)->has(Comment::factory()->count(3)))
        ->create();
}

Создаст 10 пользователей, у каждого 5 постов, у каждого поста 3 комментария. Итого: 10 + 50 + 150 записей.