📝

Laravel Seederでデータが挿入されない

2025/02/06に公開

大量の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