【Laravel5.8】SeederとFactoryを使ってダミーデータを作る
以前にもLaravelのSeederを使ってダミーデータをテーブルに挿入する方法を紹介しました。
その際にはSeederに対してこのような書き方をしていました。
public function run() { $datas = [ ['category' => '小説'], ['category' => 'ノンフィクション'], ['category' => 'ビジネス'], ['category' => '漫画'], ['category' => 'その他'], ]; DB::table('categories')->insert($datas); }
しかし、LaravelのFactory(ファクトリ)という機能を使えば、もっと簡単にランダムなダミーデータを作成することが可能です。
Seederの作り方
紐付けるModelを指定しない場合(後からModelを指定することになります)
php artisan make:seeder JobsTableSeeder
紐付けるModelを指定する場合(後からModelを指定することになります)*推奨
php artisan make:seeder JobsTableSeeder --model=Job
Factoryの作り方
紐付けるModelを指定しない場合(後からModelを指定することになります)
php artisan make:factory JobsFactory
紐付けるModelを指定する場合(後からModelを指定することになります)*推奨
php artisan make:factory JobsFactory --model=Job
database\seeds\DatabaseSeeder.phpに追記
public function run()
{
$this->call([
UsersTableSeeder::class,
// 作成したSeederの分だけ以下に追記する。
JobsTableSeeder::class,
]);
Seederの中身
<?php use Illuminate\Database\Seeder; use App\Job; class JobTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { //factoryメソッドの第二引数に指定した分のダミーデータが生まれます。 $jobs = factory(Job::class, 10)->create(); } }
Factoryの中身
$factory->define(Job::class, function (Faker $faker) { return [ // userテーブルのidと紐付ける場合は以下の書き方でOK。 'user_id' => function () { return factory(App\User::class)->create()->id; }, 'title' => $faker->word, 'content' => $faker->sentence, 'wish_at' => $faker->date, 'job_photo' => '/images/light.jpg', 'money' => $faker->numberBetween(1000, 200000), ]; });
$faker-><b>word</b>
上記のように、$faker->の後に続く語句によって生まれる値が異なります。
このあたりを参考に。
[Laravel5.1]Fakerチートシート - Qiita
[PHP] Fakerでランダムなフェイクデータを作成する - Qiita
Factoryでハマった
はじめ、
$factory->define(Job::class, function (Faker $faker) { return [ // userテーブルのidと紐付ける場合は以下の書き方でOK。 'user_id' => function () { return factory(App\User::class)->create()->id; }, 'title' => $faker->words, ★ 'content' => $faker->sentences, ★ 'wish_at' => $faker->date, 'job_photo' => '/images/light.jpg', 'money' => $faker->numberBetween(1000, 200000), ]; });
のように複数形で指定をしていました。すると以下のエラーが発生。
Notice: Array to string conversion
どうやら、
'title' => $faker->words, ★ 'content' => $faker->sentences, ★
などは生み出す値が配列となっているようです。(長い文が生まれるのかと思っていた。)
Seederの実行
composer dump-autoload php artisan db:seed // migrateと一緒に行う際には php artisan migrate --seed php artisan migrate:fresh --seed