こんにちは、h.iidaです。前回の記事の後編になります。
前編では主にFactoryの設定方法をまとめました。
今回はFactoryをどこで、どうやって使うのかがメインとなります。
※Laravel 6 を使用しています。
- 関係を持つ複数のモデルを同時に生成する
- Seederで初期投入用データを自動生成する
関係を持つ複数のモデルを同時に生成する
Coming Soon…
Seederで初期投入用データを自動生成する
Seederとは?
- シード = 初期値の種
- テストデータの設定や、環境ごとに必要な初期値などを設定するところ
- クエリビルダやSQLファイルなども使用できる
Userモデルのシーダを作成する
前編で作成したUserFactoryを使って、Userの初期投入用データを作成するUserSeederを作成します。
UserFactoryには「管理者」、「一般」、「閲覧のみ」の3つのステートを設定してありました。
今回は初期投入データとして、
- 管理者 10人
- 一般 100人
- 閲覧のみ 20人
を生成することにしました。すると、UserSeederは以下のように書けます。
<?php
use Illuminate\Database\Seeder;
use App\User;
class UserSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
DB::table('users')->truncate(); // 既存のユーザを削除
factory(User::class, 20)->create();
factory(User::class, 10)->states('admin')->create();
factory(User::class, 100)->states('general')->create();
}
}
これでこのシーダを実行する度に、130人のダミーユーザが自動で生成されるようになりました!
DatabaseSeederの設定
シーダは、以下のArtisanコマンドで実行することができます。
$ php artisan db:seed
また、マイグレーション時にシードを実行することもできます。
$ php artisan migrate --seed
このとき実行されるシーダはデフォルトで、Laravelプロジェクト作成時に自動で配置されているdatabase/seeds/DatabaseSeeder.php
となります。こちらの中身を見てみましょう。
<?php
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
// $this->call(UserSeeder::class);
}
}
他のシーダを読み込んで、実行する形になっています。
先ほどUserSeederを作成したので、コメントアウトを外して読み込まれるようにしておきましょう。
また、万が一に備えて本番環境でコマンドを実行してしまっても大丈夫なようにしておくと安心ですね。
public function run()
{
/**
* production環境では実行されません
*/
if (App::environment() != 'production') {
$this->call(UserSeeder::class);
}
}