シーディングとは
シーディング(Seeding)はデータベースにサンプルデータや初期データを投入する仕組みです。 開発環境のセットアップや自動テストでは、あらかじめデータが入っている状態が必要になります。毎回手動でデータを入力するのは手間がかかるため、シーダーを使って繰り返し実行できる形にまとめます。 シーダークラスはdatabase/seeders ディレクトリに格納されます。デフォルトで DatabaseSeeder クラスが用意されています。
シーダーの作成
make:seeder Artisanコマンドで新しいシーダークラスを生成します。
database/seeders/UserSeeder.php に配置されます。
シーダーの実装
run() メソッド内にデータ投入の処理を書きます。DBファサードやEloquentモデルを使って挿入できます。
DBファサードを使う
Eloquentモデルを使う
シーディング実行中はマスアサインメント保護が自動的に無効になります。
$fillable や $guarded の設定を気にせずデータを挿入できます。モデルファクトリーとの組み合わせ
大量のテストデータが必要な場合はモデルファクトリーとの組み合わせが便利です。ファクトリーを使うとランダムなダミーデータを一括生成できます。DatabaseSeeder の使い方
DatabaseSeeder は複数のシーダーをまとめて管理するエントリーポイントです。call() メソッドで実行するシーダーを指定します。
call() に渡した順序でシーダーが実行されます。外部キー制約がある場合は、参照先のテーブルを先にシードする順序にしてください(例:users → posts)。
シーダーの実行
全シーダーを実行する
DatabaseSeeder が呼び出され、そこから call() で指定したシーダーが順番に実行されます。
特定のシーダーだけ実行する
--class オプションで実行するシーダークラスを指定できます。
マイグレーションと同時に実行する
migrate:fresh コマンドに --seed オプションを付けると、全テーブルを再作成してからシーディングを一括実行できます。
--seeder オプションを使います。
本番環境での実行
本番環境でシーディングを実行しようとすると確認プロンプトが表示されます。確認なしで実行するには--force フラグを使います。
モデルイベントの抑制
シーディング中にモデルのイベント(creating、created など)が発火するのを防ぎたい場合は、WithoutModelEvents トレイトを使います。
call() 経由で実行される子シーダーにも適用されます。
実践例:ブログアプリのシーダー
ユーザーと投稿を持つブログアプリの初期データをセットアップする例です。次のステップ
Eloquent入門
シーダーで投入したデータをEloquent ORMで取得・操作する方法を学びます。