Связи в сидерах и фабриках
Создание связанных данных — частая задача при сидировании.
Создание через связь
$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 записей.