ダミーデータを生成する意味とは
データベースへ接続し、テーブルを作成したらテスト用データを作成したくなるかと思います。
ですが直接挿入するのはテストの一貫性が担保されません。
そこで簡単に一貫性のあるデータを流し込むことができる方法について紹介いたします。
※本記事は Laravel sail を使用し環境構築をしている想定です。
モデルの作成
物理名 | 論理名 |
---|---|
id | ID |
name | 名前 |
user_id | ユーザー識別ID |
url | URL |
remark | 備考 |
created_at | 作成日時 |
updated_at | 更新日時 |
今回は例として上記のようなカラムを持つテーブル tests とやり取りするためのモデルファイルとファクトリーを作成します。
sail artisan make:model Test -f
こちらのコマンドにより app/Models フォルダ内に Test.php が生成されます。
このとき use HasFactory;
配下に必要に応じて以下のように $fillable
を記載してください、
protected $fillable = [
'name',
'status',
'remark'
];
Laravel ではデフォルトでデータ大量挿入からデータベースを保護する仕組みがあります。
$fillable
を記載し大量割り当てを許可するカラムを指定しましょう。
こちらの記事が具体的なイメージをつかむ参考になりました!
https://qiita.com/monji586/items/58d91891caa51b514166
ファクトリーの作成
ファクトリーとはモデルを利用したダミーデータやテストデータを作ることができる機能のことです。
先ほどモデルを作成した際のコマンドに -f
オプションをつけているので database/factories フォルダ内に TestFactory.php が同時に作成されています。
まずはモデルとファクトリーを繋ぎ込むために下記のように protected $model
を宣言しましょう。
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
protected $model = Test::class;
その後 definition()
内にどのようにダミーデータを生成するか記載しましょう。
このとき fake ヘルパを使うと、ファクトリでさまざまな種類のランダムデータを生成できます。
public function definition(): array
{
return [
'name' => fake()->name(),
'user_id' => 1,
'url' => fake()->url(),
'remark' => fake()->realText(30)
];
}
fake ヘルパについてはこちらを参考にしました!
https://github.com/nshiro/faker-summary
実装後の TestFactory.php は全体としてこのようになります。
<?php
namespace Database\Factories;
use App\Models\Test;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Test>
*/
class TestFactory extends Factory
{
/**
* このファクトリに対応するモデル名
*
* @var class-string<\Illuminate\Database\Eloquent\Model>
*/
protected $model = Test::class;
public function definition(): array
{
return [
'name' => fake()->name(),
'user_id' => $this->faker->randomNumber(100),
'url' => fake()->url(),
'remark' => fake()->realText(30)
];
}
}
このコードでは以下のように生成を指示しています。
・名前
・100 までの乱数
・URL
・30 文字のテキスト
シーダーの作成とダミーデータ挿入
プログラミングにおけるシード(シーディング)とは、テストのためにデータベースにランダムなダミーデータを挿入することを意味します。
シーダーファイルの作成は下記のコマンドを実行します。
sail artisan make:seeder TestSeeder
成功後 database/seeders フォルダ内に TestSeeder.php ファイルが作成されます。
run 関数内に以下のコードを追加してください。
Test::factory(10)->create();
こちらのコードにより Test モデルに繋ぎ込み、TestFactory 内の definition 関数を実行し 10 件のダミーデータを作成するように指示しています。
このままでも実行できますがまとめて複数のテーブルのデータを生成できるように設定しましょう。
デフォルトで生成されている DatabaseSeeder 内の call メソッドを用いて以下のように記載しましょう。
/**
* データベースに対するデータ設定の実行
*/
public function run(): void
{
$this->call([
TestSeeder::class,
]);
}
ここまで設定できたらシーダーを実行し、データを挿入してみましょう。
DatabaseSeeder に記載しているシーダーを全て実行する場合は
sail artisan db:seed
特定のシーダーを実行する場合は
sail artisan db:seed --class=TestSeeder