laravelのfactory(Seederにダミーレコード処理を書かずに、各モデル毎にレコード生成処理を分離する仕組み)について調べてみた
参考URL
https://qiita.com/fagai/items/7f63d651cbed3664b758
laravelのfactoryとは、テスト用ダミーデータを作る仕組み。内部的にはFakerを使っている。
seeds/DatabaseSeeder.phpに直接ロジックを書かずに、database/factories/各モデルFactory.phpに分離しよう!という思想。
確かに、沢山のダミーデータ処理がSeederにあるとゴチャゴチャになるからな~。
1, config/app.phpで言語指定
1 2 |
// 'faker_locale' => 'en_US', 'faker_locale' => 'ja_JP', |
2, modelを作る時に一緒にfactoryも作る(–allでMVCF全部作ってもOK)
1 2 3 |
php artisan make:model "Post" --factory # 後から単体で作るのもOK php artisan make:factory PostFactory |
3, Userのfactoryは最初から存在している。
database/factories/UserFactory.php
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php use Faker\Generator as Faker; $factory->define(App\User::class, function (Faker $faker) { return [ 'name' => $faker->name, 'email' => $faker->unique()->safeEmail, 'email_verified_at' => now(), 'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret 'remember_token' => str_random(10), ]; }); |
4, 一番単純なFactoryの使い方。
seeds/DatabaseSeeder.phpで、モデル名と作りたい個数を指定すると、シーディング(php artisan migrate:fresh –seed)で生成される。
1 2 3 4 |
public function run() { factory(App\User::class, 10)->create(); } |
5, リレーション(1対N)を含んだfactory
1ユーザレコードを生成して、同時に1投稿レコードも生成する
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php use Faker\Generator as Faker; $factory->define(App\Post::class, function (Faker $faker) { return [ 'user_id' => function() { return factory(App\User::class)->create()->id; }, 'content' => $faker->name, ]; }); |
6, 1ユーザレコード生成に対して、複数の投稿レコードを生成する
Postレコードの親ユーザはNULLに変更。Userはそのまま
1 2 3 4 5 6 7 8 |
<?php $factory->define(App\Post::class, function (Faker $faker) { return [ 'user_id' => NULL 'content' => $faker->name, ]; }); |
seeds/DatabaseSeeder.phpで、ユーザを先に生成して、それから各ユーザ毎に投稿を3つずつ作る。
1 2 3 4 5 |
factory(App\User::class, 2)->create()->each(function ($user) { $user->posts()->saveMany( factory(App\Post::class, 3)->make() ); }); |
User.phpのリレーション設定を忘れずに!
1 2 3 4 5 |
// このユーザの投稿 public function posts() { return $this->HasMany('App\Post'); } |
いままでは、SeederでリレーションID=1みたいに、決め打ちで書いてたけど、こっちの方がスマートだな。