ファクトリとは
テストやデータベースシーディングでは、データベースにレコードを挿入する必要があります。 手動で各カラムの値を指定する代わりに、Laravelのモデルファクトリを使うと各Eloquentモデルのデフォルト属性セットを定義できます。 すべての新しいLaravelアプリケーションにはdatabase/factories/UserFactory.php が付属しています。
fake() ヘルパーを通じて Faker ライブラリが利用でき、様々なランダムデータを生成できます。
Fakerのロケールは
config/app.php の faker_locale オプションで変更できます。ファクトリの生成
make:factory Artisanコマンドでファクトリを作成します。
database/factories ディレクトリに配置されます。
モデルとファクトリの自動検出
モデルにHasFactory トレイトを使用すると、Laravelが自動的に対応するファクトリを見つけます。
Database\Factories 名前空間で、モデル名に Factory を付けたクラス名を検索します。
命名規則が合わない場合は UseFactory 属性で明示的に指定できます。
ファクトリの定義
definition() メソッド
ファクトリの中心となる definition() メソッドでデフォルト属性を定義します。
ファクトリステート (States)
ステートメソッドを使うと、ファクトリに対して個別の変更を定義できます。ソフトデリートのステート
ソフトデリート対応のモデルには、ビルトインのtrashed() ステートが利用できます。
ファクトリコールバック (Callbacks)
afterMaking と afterCreating でモデル生成後の追加処理を定義します。
モデルの生成
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 はテストごとにデータベースをリセットするため、テスト間でデータが干渉しません。
次のステップ
データベースシーディング
シーダーとファクトリを組み合わせて初期データを投入する方法を確認します。
テスト入門
Laravelのテスト機能とRefreshDatabaseトレイトの使い方を確認します。