【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