Laravel5.5 Faker ダミーデータを簡単に自動生成しよう

2019-07-27

DBのテストをするときにダミーのデータが欲しいですよね。
テストデータ等はSeederを使って流し込んだりするのですが、それでもそこそこのデータ件数が欲しい時には手動でつくるのはかなり面倒です。

そんな時、Fakerを使うと簡単に大量のデータを作成することができるので便利です

Factoryを生成する

モデルがある前提で進めます
モデルとはなに?って人はこちら
https://readouble.com/laravel/5.5/ja/eloquent.html

php artisan make:factory ArticleFactory --model=Article

上記コマンドから
database/factories/配下にArticleFactory.phpができます

–modelで生成するファクトリファイルへモデル名を指定できます

Fakerを書く

書き方はデフォルトで配置されているdatabase/factories/UserFactory.phpをみてください。初めからファクトリの定義が作成されていますので参考にしましょう。

こんな感じで定義してみました。

database/factories/ArticleFactory.php

use Faker\Generator as Faker;

$factory->define(App\Article::class, function (Faker $faker) {
    return [
        'user_id' => function () {
            return factory(App\User::class)->create()->id;
        },
        'title' => $faker->title,
        'description' =>  $faker->text,
        'imagePath' =>  $faker->imageUrl($width = 640, $height = 480),
        'created_at' => $faker->dateTime,
        'updated_at' => $faker->dateTime,
    ];
});

Fakerを使う

あとは使うだけ
たとえばSeederで1000件ダミーデータを流し込んだり

use Illuminate\Database\Seeder;

class ArticlesTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        // App\Articleインスタンスを1000回生成
        factory(App\Article::class, 1000)->create();
    }
}

テスト時でつかったり

public function testDatabase()
{
    // 一つのApp\Userインスタンスを作成
    $user = factory(App\User::class)->create();

    // App\Userインスタンスを3つ生成
    $users = factory(App\User::class, 3)->create();

    // モデルをテストで使用…
}

Fakerのサンプル

いろんなタイプがあります

title($gender = null|'male'|'female')     // 'Ms.'
titleMale                                 // 'Mr.'
titleFemale                               // 'Ms.'
suffix                                    // 'Jr.'
name($gender = null|'male'|'female')      // 'Dr. Zane Stroman'
firstName($gender = null|'male'|'female') // 'Maynard'
firstNameMale                             // 'Maynard'
firstNameFemale                           // 'Rachel'
lastName                                  // 'Zulauf'

phoneNumber             // '201-886-0269 x3767'
tollFreePhoneNumber     // '(888) 937-7238'
e164PhoneNumber     // '+27113456789'

詳細な一覧はこちらから
https://github.com/fzaninotto/Faker