【Laravel】3階層のリレーションを持つテストデータ作成

概要

3階層のリレーションを持つテストデータを作成したかったのですが、2階層までしかサンプルがなかったためメモなのと、なんとなくやったらエラーが出たのでメモ。

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'parent_id' cannot be null

よくある2階層のやりかた

Book->Chapterのリレーションがあるとした時は以下のようになる。

2階層
factory(App\Book::class, 10)->create()->each(function ($book) {
    $book->chapters()->saveMany(
        factory(App\Chapter::class, 5)->make()
    );
});

3階層でやってみる

Book->Chapter->Postのリレーションがあるとした時は以下のようになる。

3階層
factory(App\Book::class, 10)->create()->each(function ($book) {
    $book->chapters()->saveMany(
        factory(App\Chapter::class, 5)->make()
    )->each(function ($chapter) {
        $chapter->posts()->saveMany(
            factory(App\Post::class, 10)->make()
        );
    });
});

saveもしくはsaveManyの使い方として注意しておきたいのは、Eloquentのインスタンスをsaveメソッドの引数に指定するみたいなので、saveメソッドの引数にいれる値はEloquentインスタンスであるか(modelメソッドでインスタンス化するなど)を確認してみると良いと思います。

参考

https://laravel.com/docs/5.6/eloquent-relationships
http://am1tanaka.hatenablog.com/entry/2016/10/17/231931

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.