LoginSignup
1
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-03-23

概要

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

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4