📝
Laravel Seederでデータが挿入されない
大量のEloquent Modelを取得するような形になっていると、db:seed
が RUNNING のまま終了してしまう(DONEにならない)。
public function run(): void
{
$posts = Post::query()
->whereDoesntHave('comments')
->orderBy('id')
->get();
foreach ($posts as $post) {
Comment::factory()
->create([
'post_id' => $post,
]);
}
}
単純に下記のように、チャンクにすればOK。
public function run(): void
{
Post::query()
->whereDoesntHave('comments')
->orderBy('id')
->chunk(100, function ($posts) {
foreach ($posts as $post) {
Comment::factory()
->create([
'post_id' => $post->id
]);
}
});
}
メモリエラーやログも出ず、地味に出くわすので注意。
Discussion