Laravel Factory
投稿日:2026/01/22
LaravelのFactoryは、テストや開発時に使用するダミーデータを簡単に生成できる仕組みです。
本記事では、Factoryの基本を解説します。
前提条件
- Laravelプロジェクト作成済み(Laravel8以上)
- Eloquentモデルが存在する
Factoryとは?
Factoryは、モデルのダミーデータを自動生成する仕組みです。
できること
- ✅ テストデータ作成
- ✅ 手動データ投入の削減
Factoryを使わない場合
Task::create([
'title' => 'テストタスク',
'description' => '本文',
]);
毎回データを書く必要があります。
Factoryを使う場合
Task::factory()->create();
ダミーデータが自動生成できます。
Factoryの作成方法
① Factoryファイル作成
php artisan make:factory TaskFactory --model=Task
作成されるファイル:
database/factories/TaskFactory.php
② Factoryファイルの編集
<?php
namespace Database\Factories;
use App\Models\Task;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Task>
*/
class TaskFactory extends Factory
{
protected $model = Task::class;
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'title' => fake()->sentence(),
'description' => fake()->paragraph(),
'is_completed' => false,
];
}
}
Laravelは内部でFakerを使い、ランダムなデータを生成します。
③ Modelの修正
Laravel8以降のFactoryは、モデルにHasFactoryを設定しないと使えません。
修正前
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Task extends Model
{
protected $fillable = [
'title',
'description',
'is_completed',
];
}
修正後
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Task extends Model
{
use HasFactory;
protected $fillable = [
'title',
'description',
'is_completed',
];
}
Factoryの実行テスト
今回はSeederから実行します。
① Seeder作成
php artisan make:seeder TaskSeeder
② Seeder編集
今回はテストデータを10件登録します。
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\Task;
class TaskSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
Task::factory()->count(10)->create();
}
}
③ Seeder実行
php artisan db:seed --class=TaskSeeder
④ 登録結果の確認
DBに10件データが登録されていればOK
↓登録された1件をサンプルで記載
mysql> select * from tasks where id = 2\G;
*************************** 1. row ***************************
id: 2
title: Facilis et voluptatum eaque a itaque sed dolores culpa.
description: Cum qui nisi libero laudantium enim quasi occaecati. Doloremque nemo reiciendis debitis repellendus ipsum est.
is_completed: 0
created_at: 2026-01-22 22:06:12
updated_at: 2026-01-22 22:06:12
1 row in set (0.02 sec)
Factoryの基本的な使い方
1件作成
Task::factory()->create();
複数件作成
Task::factory()->count(5)->create();
配列だけ取得(DB保存しない)
$data = Task::factory()->make()->toArray();
Seederとの違い・使い分け
| 項目 | Factory | Seeder |
|---|---|---|
| 目的 | テスト・開発 | 初期データ |
| データ | ランダム | 固定 |
| 実行頻度 | 高 | 低 |
| 環境 | ローカル / CI | 本番 |
⚠️ 注意点
- ❌ 本番DBでFactoryを実行しない
- ✅ fakerのランダム性によるテスト不安定対策
- ✅ 件数が多い場合はパフォーマンス注意