Skip to main content

ファクトリとは

テストやデータベースシーディングでは、データベースにレコードを挿入する必要があります。 手動で各カラムの値を指定する代わりに、Laravelのモデルファクトリを使うと各Eloquentモデルのデフォルト属性セットを定義できます。 すべての新しいLaravelアプリケーションには database/factories/UserFactory.php が付属しています。
fake() ヘルパーを通じて Faker ライブラリが利用でき、様々なランダムデータを生成できます。
Fakerのロケールは config/app.phpfaker_locale オプションで変更できます。

ファクトリの生成

make:factory Artisanコマンドでファクトリを作成します。
新しいファクトリクラスは database/factories ディレクトリに配置されます。

モデルとファクトリの自動検出

モデルに HasFactory トレイトを使用すると、Laravelが自動的に対応するファクトリを見つけます。 Database\Factories 名前空間で、モデル名に Factory を付けたクラス名を検索します。 命名規則が合わない場合は UseFactory 属性で明示的に指定できます。

ファクトリの定義

definition() メソッド

ファクトリの中心となる definition() メソッドでデフォルト属性を定義します。
Fakerがよく使われるメソッドの一覧:

ファクトリステート (States)

ステートメソッドを使うと、ファクトリに対して個別の変更を定義できます。
ステートは組み合わせて使えます。

ソフトデリートのステート

ソフトデリート対応のモデルには、ビルトインの trashed() ステートが利用できます。

ファクトリコールバック (Callbacks)

afterMakingafterCreating でモデル生成後の追加処理を定義します。
ステートメソッド内でもコールバックを登録できます。

モデルの生成

make() — DBに保存しない

create() — DBに保存する

属性の上書き

make()create() に配列を渡すと、特定の属性だけ上書きできます。
ステートを使ったインライン上書きも可能です。
ファクトリでモデルを生成する際、マスアサインメント保護は自動的に無効になります。

Sequence(シーケンス)

複数モデルを生成する際に属性を交互に変える場合は Sequence を使います。
sequence() メソッドを使うとより簡潔に書けます。
クロージャでランダムな値を動的に生成することもできます。

リレーションシップのファクトリ

Has Many(1対多)

has() メソッドで「1対多」リレーションを持つモデルを生成します。
マジックメソッドを使うとより簡潔に書けます(has + リレーション名の複数形)。

Belongs To(逆リレーション)

for() メソッドで「属する」親モデルを指定します。
マジックメソッド版:

Many to Many(多対多)

hasAttached() メソッドで多対多リレーションを扱います。中間テーブルの属性も指定できます。
マジックメソッド版:

ポリモーフィックリレーション

通常の「1対多」と同様に has() またはマジックメソッドが使えます。
morphTo リレーションにはマジックメソッドは使えません。for() に関係名を明示します。

ファクトリ内でのリレーション定義

definition() 内で外部キーに別のファクトリを割り当てると、モデル生成時に自動的に親モデルも生成されます。

recycle() — 既存モデルの再利用

複数のリレーションで同じモデルインスタンスを再利用したい場合は recycle() を使います。

シーディングでの利用

DatabaseSeeder やシーダークラスからファクトリを呼び出します。
シーダーの実行:

テストでの利用

テストでは RefreshDatabase トレイトと組み合わせてファクトリを使います。
RefreshDatabase はテストごとにデータベースをリセットするため、テスト間でデータが干渉しません。
PestでテストするときもファクトリのAPIは同じです。 uses(RefreshDatabase::class) を使ってデータベースをリセットしてください。

次のステップ

データベースシーディング

シーダーとファクトリを組み合わせて初期データを投入する方法を確認します。

テスト入門

Laravelのテスト機能とRefreshDatabaseトレイトの使い方を確認します。
最終更新日 2026年4月12日