H.Iidaをフォローする

【Laravel】 ダミーデータを自動生成しよう ~後編~

バックエンド

こんにちは、h.iidaです。前回の記事の後編になります。

前編では主にFactoryの設定方法をまとめました。
今回はFactoryをどこで、どうやって使うのかがメインとなります。
※Laravel 6 を使用しています。

  1. 関係を持つ複数のモデルを同時に生成する
  2. 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);
        }
    }