概要
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