Вложенные отношения с фейером Laravel — сеялкой laravel

Я хотел сделать пост отправителя с пользователями и комментариями, как упомянуто в разделе отношений в документации laravel https://laravel.com/docs/5.5/database-testing

  $users = factory(App\User::class, 3)
->create()
->each(function ($u) {
$u->posts()->save(factory(App\Post::class)
->create()
->each(function($p){
$p->comments()->save(factory(App\Comment::class,5)
->create()
->each(function($c){
$c->user()->save(factory(App\User::class)
->make()
);
})
);
})
);
}
);

Ожидаемый результат должен был иметь 3 пользователя, имеющих сообщения с 5 комментариями каждый.

Но произошла ошибка:

В строке Builder.php 2459: вызов неопределенного метода
Осветить \ Database \ Query \ Builder :: сохранить ()

2

Решение

попробуй это :

$users = factory(App\User::class, 3)
->create()
->each(function ($u) {
$u->posts()->save(factory(App\Post::class)->make())
->each(function($p){
$p->comments()->save(factory(App\Comment::class,5)->make())
->each(function($c){
$c->user()->save(factory(App\User::class)
->make()
);
})
);
})
);
}
);

Решение с регулярным foreach

$users = factory(App\User::class, 3)->create();

foreach($users as $user){
$post = $user->posts()
->create(factory(App\Post::class)->make()->toArray());
$post->comments()
->createMany(
factory(App\Comment::class, 5)
->make(['user_id' => factory(App\User::class)
->create()->id])->toArray());
}
0

Другие решения

Есть несколько проблем в вашем решении, например

$p->comments()->save(factory(App\Comment::class,5)

Вы пытаетесь сохранить несколько комментариев с помощью save (), что приведет к ошибке. Вместо этого следует использовать saveMany ().
Однако решение вашей проблемы может быть следующим:

$users = factory(App\User::class, 3)->create()
->each(function ($user) {
$user->posts()->saveMany(factory(App\Post::class, 5)->make());
});
foreach ($users as $user){
foreach ($user->posts as $post){
$post->comments()->saveMany(factory(App\Comment::class, 5)->make());
}
}

это будет работать как ожидалось.

0

По вопросам рекламы [email protected]