Laravelのデータベースにテストデータや初期データを投入する
「php artisan db:seed」コマンドについて、基本的な使い方から
実務での活用方法、よくあるエラーと対処法まで解説します。
💡 他のコマンドも知りたい方は artisanコマンド完全チートシート をご覧ください
1. db:seedコマンドとは
php artisan db:seed は、Seederクラスを実行してデータベースに
レコードを投入するコマンドです。
このコマンドでできること
- 開発・テスト環境へのテストデータ一括投入
- 本番環境への初期マスターデータ登録
- 特定のSeederクラスだけを選択して実行
- migrateと組み合わせてDB構築を一発で完了
いつ使うのか
✅ 必ず使うタイミング:
- 新しい開発環境を構築したとき
- git clone後にテストデータが必要なとき
- CI/CDでテスト用DBをリセットするとき
- 本番環境に初期マスターデータを投入するとき
⚠️ 注意が必要なタイミング:
- 本番環境での実行(–forceが必要、後述)
2. 実際にやってしまったミスと教訓
本番環境で php artisan db:seed を実行してしまい、
すでに存在するマスターデータが重複登録されてしまったことがあります。
Seederに truncate() が入っていた場合はさらに深刻で、
本番データが全消去されるリスクもあります。
本番でSeederを実行する際は必ず以下を確認してください。
--classで対象を絞る- Seeder内に
truncate()が含まれていないか確認する - 実行前にDBのバックアップを取る
3. 基本的な使い方
最も基本的な使い方
すべてのSeederを実行します(DatabaseSeederが起点になります)。
php artisan db:seed実行結果:
INFO Seeding database.
Database\Seeders\UserSeeder ………. RUNNING
Database\Seeders\UserSeeder ………. 18.77 ms DONEオプション一覧
| オプション | 説明 | 使用例 |
|---|---|---|
| –class | 実行するSeederクラスを指定 | –class=UserSeeder |
| –database | 接続先DBを指定 | –database=mysql |
| –force | 本番環境で強制実行 | –force |
4. –classオプションの使い方
特定のSeederだけを実行したい場合に使います。
実務では最もよく使うオプションです。
php artisan db:seed --class=UserSeeder実行結果:
INFO Seeding database.
Database seeding completed successfully.複数のSeederを順番に実行したい場合
–classは1つしか指定できないため、
DatabaseSeederにまとめて呼び出す方法が実用的です。
public function run(): void
{
$this->call([
UserSeeder::class,
ProductSeeder::class,
CategorySeeder::class,
]);
}// まとめて実行
php artisan db:seed5. 実務での使用シーン
シーン1: 開発環境の初期構築
git clone後の環境構築で一番よく使うパターンです。
composer install
cp .env.example .env
php artisan key:generate
php artisan migrate --seed # migrateとseedを同時実行シーン2: DB再構築(開発中によく使う)
# テーブルを全削除して最初からやり直す
php artisan migrate:fresh --seed⚠️ migrate:fresh は全テーブルを DROP するので
本番環境では絶対に使わないでください。
シーン3: 特定テーブルのデータだけ入れ直す
開発中に特定のマスターデータだけ更新したいときに使います。
php artisan db:seed --class=PrefectureSeederシーン4: CI/CDでの利用
# GitHub Actions等でのテスト前処理
php artisan migrate:fresh --seed --env=testing6. よくあるエラーと対処法
エラー1: “Class not found”
php artisan db:seed --class=UserSeeder
# Error: Target class [UserSeeder] does not exist.原因:名前空間の指定が足りない、またはオートロードが更新されていない
解決方法:
# 名前空間を含めて指定
php artisan db:seed --class="Database\Seeders\UserSeeder"
# またはオートロードを更新してから実行
composer dump-autoload
php artisan db:seed --class=UserSeederエラー2: 本番環境で確認プロンプトが出る
**************************************
* Application In Production! *
**************************************
Do you really wish to run this command? (yes/no) [no]:対処法:
# 本当に実行する場合のみ
php artisan db:seed --force⚠️ 本番では –class で対象を絞ってから実行することを強く推奨します。
エラー3: “SQLSTATE: Duplicate entry”
原因:同じデータを2回投入しようとしている
解決方法:
// firstOrCreate を使って重複を防ぐ
User::firstOrCreate(
['email' => 'admin@example.com'],
['name' => 'Admin', 'password' => bcrypt('password')]
);
// または updateOrCreate
User::updateOrCreate(
['email' => 'admin@example.com'],
['name' => 'Admin']
);「コロンなし」で検索している方へ:
「php artisan db seed」「db-seed」「artisan seed」と検索している方も、
このページで解説している「db:seed」コマンドが対象です。
コロン(:)あり「db:seed」が正しいコマンド名です。
7. チートシート(コピペ用)
# 全Seeder実行
php artisan db:seed# 特定クラスだけ実行
php artisan db:seed --class=UserSeeder# 名前空間付きで指定
php artisan db:seed --class="Database\Seeders\UserSeeder"# migrate と同時実行
php artisan migrate --seed# 全テーブルリセット+seed(開発環境のみ)
php artisan migrate:fresh --seed# 本番環境での強制実行(要注意)
php artisan db:seed --force8. 関連するArtisanコマンド
php artisan migrate --seed— migrate実行時にseedも同時実行php artisan migrate:fresh --seed— 全リセット後にseedphp artisan make:seeder— Seederクラスの新規作成php artisan make:factory— Factoryクラスの新規作成
まとめ
覚えておくべきポイント
✅ DO(やるべきこと):
- 開発環境では migrate:fresh –seed を活用する
- 本番では –class で対象Seederを絞る
- firstOrCreate / updateOrCreate で重複を防ぐ
❌ DON’T(やってはいけないこと):
- 本番環境で migrate:fresh –seed を実行する
- Seederに truncate() を書いて本番実行する
- –force を深く考えずに使う

