【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 \Illuminate\Database\Eloquent\Factory $factory */
use App\Example;
use Faker\Generator 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 Illuminate\Database\Seeder;
class ExampleSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
//
factory(App\Example::class, 10)->create();
}
}
シーダーのクラスをDatabaseSeederで呼び出す
シーディングを実行すると、デフォルトで用意されているシーダーファイルのDatabaseSeederを実行します。
そのため、シーディングを実行した際に、上記で作成したシーダーを呼び出すには、以下の例のようにDatabaseSeederのrun()メソッド内で、call()メソッドを利用して呼び出します。
call()メソッドでは、引数に作成したシーダーのクラスを配列で指定します。
<?php
use Illuminate\Database\Seeder;
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