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

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

こんにちは!

今回は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の使い方やテストコードの書き方などは別の記事で紹介しているので、ご興味があればぜひ見てみてください。

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