Laravelのシーダーでテスト用のデータを作成するときに、それっぽいテスト用データを自動的に生成してくれるモデルファクトリが利用できます。
これで「ああああ太郎」とか「テストテストテストテストテスト」だらけのテストデータとおさらばできます。
前提
例えば topics
というテーブルがあるとします。
構造はこんな感じ
テーブル名: topics
フィールド | 中身 |
---|---|
title | 記事のタイトル |
content | 記事の内容 |
的なテーブルがあるとします。
Eloquent(モデル): Topic
まで作成済みの前提。
シーダーの作成
$ php artisan make:seeder TopicsTableSeeder
database/seeds/TopicsTableSeeder.php
が作成されます
とりあえず、シーダーファイルはそのままにして、ファクトリをつくります。
モデルファクトリを作成
$ php artisan make:factory TopicFactory --model=Topic
database/factories/TopicFactory.php
が作成されます
ファクトリを記述
use Faker\Generator as Faker;
$factory->define(App\Topic::class, function (Faker $faker) {
return [
'title' => $faker->sentence(rand(1,4)), // 1〜4つの単語で文章
'content' => $faker->realText(512), // 512文字の文章
];
});
titleには、1〜4の単語でできた文章
contentには、512文字のテキスト
と定義します。
Fakerについて
この定義内容は何かと言うと
Faker
というテスト用データを作成してくれるPHPライブラリの機能になります。
詳しくは
https://github.com/fzaninotto/Faker
こちらにあります。
よく使いそうなのは
$faker->word() // 単語
$faker->sentence(n) //単語数指定した文章
$faker->text($max) //$max文字数までの文章
$faker->name() //名前 (日本語)
$faker->realText() //文字数指定した文章 デフォルトは200(日本語)
$faker->phoneNumber() //電話番号(日本語)
$faker->address() //住所(日本語)
$fake->company() //会社名(日本語)
などなど、
日本語対応
Fakerは、そのままだと英語っぽい単語などがでてきちゃいますが、設定により日本語対応可能です。
config/app.phpに追記
'faker_locale' => env('APP_FAKER_LOCALE', 'ja_JP'),
.envに追記することで、環境ごとにわけたりもできます。
APP_FAKER_LOCALE=ja_JP
全部が日本語対応しているわけじゃないですが、上記で紹介した(日本語)と書いてある項目は対応していました。
シーダーの実行
というわけであとはシーダーの実行です。
public function run()
{
factory(App\Topic::class, 20)->create(); // 20件のデータを作成
}
20のところを変えれば何件でも作成可能です。
実行
$ php artisan db:seed --class=TopicsTableSeeder
以上で、簡単に大量のテスト用データを作成することができました。
名前とか、ほんとにそれっぽいのを生成してくれるので、手間が省略されて作業が捗ります。
関係ないけど、Seederってシーダーなのかシーダなのか迷いますね。
参考
https://readouble.com/laravel/5.5/ja/seeding.html
https://github.com/fzaninotto/Faker
https://qiita.com/kazuhei/items/5d33eedb9ebdd62e0bfb