ファクトリでリレーションがあるモデルのテストデータを生成するパターンをメモしています。
公式リファレンス(データベースのテスト)
###親子関係
User(親)->Movie(子)のように、二つのテーブル間の親子関係なら公式リファレンスにある方法で簡単にテストデータを生成できます。each()とモデルのリレーションメソッドを利用します。
factory(App\Models\User::class)
->create()
->each(function ($user) {
$user->movies()->save(factory(App\Models\Movie::class)->make());
});
###親子孫関係
User(親)->Movie(子)->Review(孫)のように三つ以上のテーブル間に関係がある場合は上の方法をそのまま使うことはできません。なので外部キーとなる属性をオーバライドしてリレーションを構築します。
factory(App\Models\User::class)->create()->each(function ($user) {
factory(App\Models\Movie::class)->create(['user_id' => $user->id])->each(function ($movie) {
factory(App\Models\Review::class)->create(['movie_id' => $movie->id]);
});
});