【Laravel】データベースに複数のランダムデータをセットする例|モデルファクトリ

PHPフレームワークのLaravelでは、大量のランダムデータを、データベースにセットする処理を設定できるモデルファクトリという機能があります。

今回は、そのモデルファクトリを、テーブルに初期値やダミーレコードをセットできるシーディングで実行して、ランダムデータをセットする簡単な例となります。

また、テーブルに任意のデータをセットするシーディングについては、以下のリンク先を参考にしてみてください。

【Laravel】モデルファクトリを利用しテーブルに複数のランダムデータをセットする例

モデルファクトリをシーディングで実行するには、ファクトリファイルとシーダーファイルを作成し、シーディング時に実行する処理を追記します。

以下、モデルファクトリを利用したシーディングを行う手順例となります。

また、データをセットするテーブルと、そのテーブルのモデルは、すでに作成してある前提としています。

ファクトリファイルを作成

ファクトリファイルを作成するコマンドは以下となり、オプションでデータをセットするテーブルのモデルを指定します。

また、作成したファクトリファイルは、database/factoriesフォルダ内に追加されます。

php artisan make:factory ファイル名 --model=モデル名

今回の例では、ファクトリファイルの名前をExampleFactoryとし、利用するモデルの名前をExampleとして、以下のコマンドを実行します。

php artisan make:factory ExampleFactory --model=Example

ランダムデータをテーブルにセットする処理をファクトリに追記

次に、作成したファクトリファイルのdefine()メソッドに、ランダムデータをテーブルにセットする処理を追記します。

以下、追記したファクトリファイルの例となります。define()メソッドの第1引数には、データをセットするテーブルのモデルクラスを指定し、第2引数には、ランダムデータをセットするクロージャを指定します。

<?php

/** @var IlluminateDatabaseEloquentFactory $factory */

use AppExample;
use FakerGenerator as Faker;

$factory->define(Example::class, function (Faker $faker) {
    return [
        // テーブルにランダムデータをセットする処理 
        'name' => $faker->text($maxNbChars = 20),
        'date' => $faker->date($format = 'Y-m-d', $max = 'now'),
        'age' => $faker->numberBetween($min = 0, $max = 99),
    ];
});

define()メソッドの第2引数のクロージャは、ランダムデータを生成できるPHPライブラリーのFakerインスタンスを受け取けとり、そのプロパティ・メソッドによって、指定した形式のランダムデータを生成します。

今回のクロージャでは、テーブルに以下のデータをセットする処理を追記しています。

  • nameカラムにtext($maxNbChars = 20)でダーミテキストをセット(20文字以内)
  • dateカラムにdate($format = 'Y-m-d', $max = 'now')でランダムの日付をセット(年月日のフォーマットはY-m-d、上限は現在の日付)
  • ageカラムにnumberBetween($min = 0, $max = 99)でランダムの整数をセット(下限は0、上限は99)

Fakerのプロパティ・メソッドで生成できる、その他のランダムデータについては、文末の参考サイトを確認にしてみてください。

シーダーファイルを作成

次に、上記で作成したファクトリを利用するシーダーファイルを作成します。

シーダーファイルを作成するコマンドは以下となります。また、作成したシーダーファイルは、database/seedsフォルダ内に追加されます。

php artisan make:seeder ファイル名

今回の例では、シーダーファイルの名前をExampleSeederとして、以下のコマンドを実行します。

php artisan make:seeder ExampleSeeder

ファクトリのヘルパー関数をシーダに追記

作成したシーダーファイルのrun()メソッド内に、以下の例のようにファクトリを利用するヘルパー関数を追記します。

factoryのヘルパー関数の第1引数には、利用するモデルクラスを指定し、第2引数にはセットするレコード数を指定します。そして、create()メソッドでテーブルにデータをセットします。

<?php

use IlluminateDatabaseSeeder;

class ExampleSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //
        factory(AppExample::class, 10)->create();
    }
}

シーダーのクラスをDatabaseSeederで呼び出す

シーディングを実行すると、デフォルトで用意されているシーダーファイルのDatabaseSeederを実行します。

そのため、シーディングを実行した際に、上記で作成したシーダーを呼び出すには、以下の例のようにDatabaseSeederのrun()メソッド内で、call()メソッドを利用して呼び出します。

call()メソッドでは、引数に作成したシーダーのクラスを配列で指定します。

<?php

use IlluminateDatabaseSeeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        // 呼び出すシーダーのクラスを配列で指定
        $this->call([
            ExampleSeeder::class,
        ]);
    }
}

Composerのオートロードを実行

次に、作成したファイルを自動で読み込ませるため、以下のコマンドでComposerのオートロードを実行します。

composer dump-autoload

シーディングを実行

Composerのオートロードを実行後、以下のコマンドで、シーディングを行いDatabaseSeederを実行します。それにより、シーダクラスに従ってテーブルにデータをセットできます。

php artisan db:seed

データベースをすべて作成し直してデータをセットしたい場合は、以下のコマンドを実行することで、すべてのテーブルを削除後にマイグレーションを実行し、シーディングを行います。

php artisan migrate:fresh --seed

参考サイトなど

コメント投稿コメント投稿欄を開く

コメントは、以下の項目(*は必須項目)を入力し「コメントを送信」ボタンから送信お願いします。メールアドレスは公開されることはありません。
Twitterで返信する場合はこちらから。

また、コメントは承認制となります。