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

「そもそもLaravelのfactoryって何?」
「Laravelのfactoryの具体的な使い方を知りたい」
このようにお考えの方は参考になるかと思います。
本記事では、以下のようなことがわかります。
- Laravel Factoryの概要
- Laravel Factoryを使ったダミーデータ作成方法
- 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版 [ 掌田津耶乃 ]
コメント