Laravel Factoryを使ったダミーデータ作成方法

Laravel

こんにちは!

今回はLaravelのFactoryという機能をご紹介していきます。

開発を行っていると、データベースに何かしらのダミーデータを作成したくなる場合がありますよね。そんな時にFactoryを使うことで、ダミーデータを簡単に作成することができます

読者
読者

「そもそもLaravelのfactoryって何?」

「Laravelのfactoryの具体的な使い方を知りたい」

このようにお考えの方は参考になるかと思います。

本記事では、以下のようなことがわかります。

  1. Laravel Factoryの概要
  2. Laravel Factoryを使ったダミーデータ作成方法
  3. Seederやテストコードでの活用方法

それでは、さっそくみていきましょう!

Laravel Factoryの概要

Laravel Factoryとは、データベースにダミーデータを作成するためのLaravelに備わっている機能の一つです。

Factoryを活用することで、ダミーデータを簡単に作成することができ、テストやSeederなどに活用することができます。また、コードの再利用性が向上して、テストデータのメンテナンスが楽になります。

実際にどのようなことができるかみた方が早いので、さっそくみていきましょう。

Laravel Factoryの使い方

Laravel Factoryの基本的な使い方についてみていきます。

前提条件として、Laravelのバージョンは9系で確認しています。

Factoryの定義

Factoryクラスは以下のコマンドから作成することができます。

$ php artisan make:factory クラス名

LaravelはデフォルトでUserFactoryクラスが定義されているはずです。こちらをみていきましょう。

ファイルは「database/factories/UserFactory.php」にあります。

public function definition(): array
{
    return [
        'name' => fake()->name(),
        'email' => fake()->unique()->safeEmail(),
        'email_verified_at' => now(),
        'password' => static::$password ??= Hash::make('password'),
        'remember_token' => Str::random(10),
    ];
}

Factoryを定義する場合は、このdefinitionメソッドの中で定義します。
ここでは、ユーザー名、メールアドレス、パスワードに適当なダミーデータを定義しています。

Factoryでは、fakeヘルパを使うことでダミーデータを作成します。fakeヘルパでは、nameやemailやtextなど生成したいデータの種類によって使い分けることで、データの種類に合った適切なダミーデータを生成してくれます。

また、モデルにHasFactoryトレイトをインポートする必要があります。

use Illuminate\Database\Eloquent\Factories\HasFactory;

use HasFactory

ダミーデータの作成方法

Factoryを呼び出す場合は、以下のように呼び出します。

use App\Models\User;

$user = User::factory()->create();
$user = User::factory()->count(3)->create(); // 複数作成したい場合

こちらをテストコードやSeederなどで呼び出すといった使い方になります。

ちなみに、モデルのみを生成したい場合は以下のようになります。

use App\Models\User;

$user = User::factory()->make();
$user = User::factory()->count(3)->make(); // 複数作成したい場合

こちらの場合は、インスタンスを生成するのみでデータベースへの保存は行われません。

fakeヘルパ

以下に、よく使われるfakeヘルパを並べておきます。チートシートとして使ってください。

// 住所系
fake()->postcode(); // 郵便番号
fake()->prefecture(); // 都道府県
fake()->ward(); // 区
fake()->city(); // 市
fake()->streetAddress(); // 市区町村と番地

// 個人情報系
fake()->name(); // 名前
fake()->unique()->safeEmail(); // 重複のないメールアドレス
fake()->phoneNumber(); // 電話番号
fake()->company(); // 会社名

// テキスト系
fake()->sentence(8); // タイトルなど
fake()->realText(10); // 文章

// 数字系
fake()->numerify('##'); // 2桁の数字
fake()->numberBetween(1, 10); // 1〜10までのランダムな数字

// 日時系
fake()->date('Y-m-d'); // 日付
fake()->dateTime('now')->format('Y-m-d H:i:s'); // 日時
fake()->dateTimeBetween('-3days', '3days')->format('Y-m-d'); // 3日前から3日後までのランダムな日時

// 番外編
fake()->url(); // URL

Seederで使う場合

このセクションでは、Seederで使う場合のサンプルコードをみていきます。

Seederで使う場合は、DatabaseSeederで以下のように書けばOKです。

public function run(): void
{
    User::factory()->count(10)->create(); // 10ユーザー生成
}

テストコードで使う場合

テストコードで使う場合は以下のようになります。

use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
use App\Models\User;

class UserTest extends TestCase
{
    use RefreshDatabase;

    public function test_example()
    {
        // 1. UserFactoryを使用してダミーユーザーを生成
        $user = User::factory()->create([
            'name' => 'John Doe',
            'email' => 'john@example.com',
        ]);

        // 2. テスト用のダミーデータが正しく作成されたかどうかをアサーション
        $this->assertEquals('John Doe', $user->name);
        $this->assertEquals('john@example.com', $user->email);

        // 3. テスト用のダミーデータがデータベースに実際に保存されたかを確認
        $this->assertDatabaseHas('users', [
            'name' => 'John Doe',
            'email' => 'john@example.com',
        ]);
    }
}

createメソッドは引数に配列でプロパティを指定することで、生成するデータをセットすることもできます。

まとめ

ここまでみてきたように、Factoryはテストコードやダミーデータの作成時に必要になることが多いです。

Factoryが使えれば、ダミーデータを作成して開発を効率的に進めることができるので、ぜひこの機会に身につけてみてください。

また、Seederの使い方やテストコードの書き方などは別の記事で紹介しているので、ご興味があればぜひ見てみてください。

参考

参考リンク

11.x Eloquent:ファクトリ Laravel
[laravel]Factoryの基本的な使い方とちょっと便利な使い方 - Qiita
はじめにlaravelではテスト時など決まったデータなどが欲しい場合に自動で投入してくれるFactoryという機能がある。今回はそのFactoryの基本的な使い方のおさらいと少し拡張した便利な使…
GitHub - nshiro/faker-summary: よく使う Faker のまとめです
よく使う Faker のまとめです. Contribute to nshiro/faker-summary development by creating an account on GitHub.

参考書籍


PHPフレームワークLaravel入門第2版 [ 掌田津耶乃 ]

コメント

タイトルとURLをコピーしました