db:seed
データベースにダミーデータや初期データを挿入するための Artisan コマンドです。
- カテゴリ: artisan
- 掲載バージョン: Laravel 12・PHP 8.4
- 名前空間 / FQCN / コマンド:
php artisan db:seed - 関連: migrate, make:seeder, db:reset, db:seed –class, migrate:refresh
- 変更履歴: ver 8.0 :
--classオプション追加
要点(TL;DR)
- 何に使うか:初期データや開発用データを DB に投入
- 最低限の使い方:
php artisan db:seed - よくある罠
- 本番環境で
--forceを付け忘れると失敗 - 既存データを上書きしてしまうことがある
- Seeder クラス名のスペルミスでエラーになる
概要
db:seed は database/seeders ディレクトリ内の Seeder クラスを実行し、DB にレコードを挿入します。
開発環境でテストデータを作成したり、初期データを投入したりする際に頻繁に使われます。
本番デプロイ時は --force オプションを付けて確認をスキップします。
構文 / シグネチャ
php artisan db:seed
| オプション | 型 | 必須 | 既定値 | 説明 |
|---|---|---|---|---|
--class= | string | DatabaseSeeder | 実行する Seeder クラスを指定 | |
--database= | string | デフォルト接続 | 使用する DB 接続を指定 | |
--force | bool | false | 本番環境で実行する際に確認をスキップ | |
--quiet | bool | false | 出力を抑制 | |
--verbose | bool | false | 詳細出力 | |
--path= | string | Seeder ファイルのパスを指定 | ||
--env= | string | 現在の環境 | 実行環境を切り替える |
戻り値:なし(プロセスは標準出力と終了コードで結果を返します)
例外/副作用:DB への書き込み、外部トリガー実行。失敗時は Illuminate\Database\QueryException 等が投げられ、終了コード 1 が返ります。
使用例
最小例
php artisan db:seed
実務例
# ユーザーデータを作成する専用 Seeder を実行
php artisan db:seed --class=UserSeeder
UserSeederはdatabase/seeders/UserSeeder.phpに実装し、$this->call()で他の Seeder を連鎖させることも可能。- 本番環境で初期化時に実行する場合は
--forceを付ける。
よくある落とし穴・注意
| 症状/エラー | 原因 | 対処 |
|---|---|---|
Class 'UserSeeder' not found | Composer の autoload が更新されていない | composer dump-autoload を実行 |
| データが重複して挿入される | Seeder が insert の代わりに create を使っている | upsert か firstOrCreate を検討 |
| 本番でデータが上書きされる | データの unique 制約に違反 | if (!User::exists(...)) { User::create(...); } などで回避 |
代替・関連APIとの比較
| 代替手段 | メリット | デメリット |
|---|---|---|
php artisan migrate:refresh --seed | マイグレーションとシードを同時に実行 | 大量データの場合時間がかかる |
php artisan migrate:fresh --seed | DB を全消去して再作成 | 本番では不可 |
php artisan make:seeder + --class で個別実行 | 目的の Seeder だけ実行可能 | 手動でクラス名を指定する手間 |
選定基準
- データベースを再作成する必要がない場合 →
db:seed - マイグレーションと同時にシードしたい場合 →
migrate:refresh --seed - 本番で確実にデータを投入したい場合 →
db:seed --force
テスト例(Pest)
it('inserts users via UserSeeder', function () {
// シーダー実行
Artisan::call('db:seed', ['--class' => UserSeeder::class]);
// 期待するレコードが存在することを確認
expect(User::count())->toBeGreaterThan(0);
});
トラブルシュート
| トラブル | 原因 | 解決策 |
|---|---|---|
| Seeder が実行されない | database/seeders 以外の場所にファイルがある | --path= を使用 |
シード中に PDOException が発生 | データベース接続情報が間違っている | php artisan config:clear と --database= を確認 |
