Laravelで--seedオプションを使ってマイグレーション後にSeederを実行する方法!初心者でもわかる初期データ登録
生徒
「先生、Laravelでテーブルを作った後にすぐダミーデータを登録する方法ってありますか?」
先生
「ありますよ。それが--seedオプションです。マイグレーションを実行すると同時にSeederを実行できます。」
生徒
「どうやって使うんですか?」
先生
「コマンドの最後に--seedを付けるだけです。簡単にマイグレーションとデータ登録を同時に行えます。」
1. --seedオプションとは?初心者が知っておくべき役割
Laravelの--seedオプションとは、マイグレーション(テーブル作成)の完了と同時に、自動でSeeder(データ登録)を実行してくれる魔法のような追加機能です。
通常、データベースを利用するには「テーブルという箱を作る(マイグレーション)」作業と、「その中にデータを入れる(シーディング)」作業の2ステップが必要です。しかし、このオプションを使えばコマンド一つで両方を完結させることができます。
マイグレーションが「新しい本棚を組み立てること」だとしたら、Seederは「その本棚にサンプル本を並べること」です。
--seedオプションを使うと、本棚が完成した瞬間に、自動で本が綺麗に並んでいる状態になります。
プログラミングの学習中やアプリの開発初期は、動作確認のために何度もテーブルを消したり作り直したりします。その度に手動でテストデータを入れるのは時間がもったいないですよね。そこで、以下のようなコードをあらかじめ用意しておきます。
// database/seeders/UsersTableSeeder.php のイメージ
// 初心者でも「10人分のテスト用ユーザーを作る」という命令が書けます
public function run(): void
{
\App\Models\User::factory(10)->create();
}
この準備をしておけば、後ほど紹介するコマンドの末尾に--seedと書き加えるだけで、「テーブルは空っぽだけど、テストしたいのにログインできない!」という悩みから解放されます。開発スピードを劇的に上げる、現場でも必須のテクニックです。
2. マイグレーションとSeederの基本
まずマイグレーションとは、データベースのテーブルを作成したり、構造を変更したりする機能です。Laravelではphp artisan migrateでマイグレーションを実行します。
Seederはdatabase/seedersディレクトリに作成され、run()メソッド内にデータ登録の処理を書きます。
3. Seederを作成する方法
ターミナルで次のコマンドを実行します。
php artisan make:seeder UsersTableSeeder
php artisan make:seeder PostsTableSeeder
これでUsersTableSeederやPostsTableSeederがdatabase/seedersに作成されます。run()メソッド内でFactoryなどを使い、ダミーデータを生成します。
4. DatabaseSeederでSeederをまとめる
複数のSeederをまとめて実行する場合、DatabaseSeeder.phpを使います。call()メソッドで個別のSeederを呼び出します。
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
public function run(): void
{
$this->call([
UsersTableSeeder::class,
PostsTableSeeder::class,
]);
}
}
これでDatabaseSeederを呼ぶだけで、指定したSeederが順番に実行されます。
5. migrate:freshと--seedの組み合わせ
新しい開発環境でテーブルを作り直し、すぐにSeederを実行したい場合はmigrate:freshと--seedを組み合わせます。
php artisan migrate:fresh --seed
このコマンドで、まず既存のテーブルを削除してマイグレーションを実行し、その後DatabaseSeederを使ってまとめてデータが登録されます。
6. 実行手順のイメージ
手順を簡単にまとめると次の通りです。
- Seederを作成する(
php artisan make:seeder) - DatabaseSeederで
call()を使ってまとめる php artisan migrate:fresh --seedでマイグレーションとSeederを同時実行
これで、開発用の初期データが一括で用意できます。
7. 注意点
--seedオプションは非常に便利ですが、本番環境では注意が必要です。migrate:freshを使うとデータベースが初期化されるため、実データが消えてしまいます。
開発環境やテスト環境で使うのが基本です。本番環境ではSeederを慎重に実行しましょう。
まとめ
今回の記事では、Laravelの開発効率を劇的に向上させる「--seedオプション」の活用方法について詳しく解説してきました。Webアプリケーションの開発現場では、データベースのテーブル構造を定義する「マイグレーション」と、動作確認用のテストデータを投入する「シーダー」は、切っても切り離せない関係にあります。
特に開発の初期段階や、チームメンバー間で環境を共有する際、手動で何度も同じコマンドを叩くのは非効率です。php artisan migrate --seedや、テーブルをゼロから作り直すphp artisan migrate:fresh --seedといったコマンドをマスターすることで、常にクリーンかつ実用的なデータが入った環境を瞬時に構築できるようになります。
Laravelのマイグレーションとシーダーの連携が重要な理由
なぜ、わざわざコマンド一つにまとめる必要があるのでしょうか。それは、「データベースの構造(スキーマ)」と「そこに入るデータの整合性」を常に保つためです。 例えば、新しいカラムを追加したときに、そのカラムに対応するテストデータも一緒に流し込まなければ、アプリの画面を表示した際にエラーが出てしまうことがあります。マイグレーション実行と同時にシーダーを走らせる癖をつけておけば、こうした凡ミスを防ぐことができるのです。
さらに一歩進んだSeederの実装例
まとめとして、より実戦に近いコード例を振り返ってみましょう。単に固定の値をいれるだけでなく、モデルファクトリ(Factory)を組み合わせることで、100件や1000件といった大量のデータを一瞬で作ることができます。
まず、モデルファクトリを利用したUsersTableSeederの例です。
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use App\Models\User;
class UsersTableSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
// UserモデルのFactoryを使って、ランダムなユーザーを50人作成する
User::factory()->count(50)->create();
// 特定のテスト用管理ユーザーを一人作成しておく
User::factory()->create([
'name' => 'テスト管理者',
'email' => 'admin@example.com',
'password' => bcrypt('password123'),
]);
}
}
このように記述しておけば、開発中にログインして挙動を確認するための「決まったアカウント」と、一覧画面のレイアウトを確認するための「大量のダミーユーザー」を同時に用意できます。
DatabaseSeederによる一括管理のメリット
プロジェクトが大きくなると、CategoriesTableSeeder、ProductsTableSeeder、OrdersTableSeederのように、シーダークラスの数はどんどん増えていきます。これらをバラバラに実行するのは現実的ではありません。
そこで、DatabaseSeeder.phpの役割が重要になります。
namespace Database\Seeders;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
public function run(): void
{
// 実行する順番も考慮できる(例:親テーブルを先に、子テーブルを後に)
$this->call([
UsersTableSeeder::class,
CategoriesTableSeeder::class,
ProductsTableSeeder::class,
]);
}
}
--seedオプションを付けた際、LaravelはデフォルトでこのDatabaseSeederクラスのrunメソッドを呼び出します。ここにプロジェクトで必要な全てのデータを定義しておくことが、開発環境構築の「自動化」への近道です。
実際の運用でよく使うコマンドまとめ
実務で頻繁に利用するバリエーションを整理しました。
- 通常のマイグレーション+シード:
既存のテーブルを維持しつつ、新しいマイグレーションを実行してデータを追加します。php artisan migrate --seed - データベースの完全再構築+シード:
これが最も頻繁に使われます。テーブルを全てドロップしてから作成し直し、データを入れ直します。php artisan migrate:fresh --seed - 特定のシーダークラスだけを指定して実行:
--seedオプションではなく、単体で実行したい場合です。php artisan db:seed --class=UsersTableSeeder
本番環境での注意点(再確認)
記事の本文でも触れましたが、migrate:freshは「全テーブル削除」という強力な破壊的コマンドです。本番サーバーで誤って実行すると取り返しがつかないことになります。
Laravelには標準で、本番環境(production)での実行時に警告が出る仕組みがありますが、設定ミスや操作ミスを想定し、重要なデータが入っている環境ではバックアップを必ず取る運用を心がけましょう。
生徒
「先生、ありがとうございました!--seedオプションのおかげで、データベースの作り直しとダミーデータの準備が一瞬で終わるようになりました。これまでは、マイグレーションの後に毎回手動でテストデータを打ち込んでいたので、かなり感動しています!」
先生
「それは良かったです。開発効率が上がると、本来集中すべき『アプリのロジック作り』に時間を割けるようになりますからね。ちなみに、シーダーの中でFactoryを使ってみましたか?」
生徒
「はい!User::factory()->count(100)->create();と書くだけで、名前もメールアドレスもランダムなユーザーが100人も作れたので驚きました。ただ、たまに『外部キー制約』でエラーが出ちゃうことがあるんですけど、これはどうしてですか?」
先生
「いい質問ですね。それは実行順序の問題かもしれません。例えば、記事(Posts)データを登録しようとしているのに、その親となるユーザー(Users)データがまだ存在しない場合にエラーが起きます。DatabaseSeederのcallメソッドに書く順番を、親テーブルから子テーブルの順に並び替えてみてください。」
生徒
「なるほど、順番も大事なんですね。DatabaseSeeder.phpでしっかり交通整理をするイメージですね。あともう一つ、本番環境で間違えてmigrate:fresh --seedを打たないか心配なのですが……。」
先生
「Laravelでは、.envファイルのAPP_ENVがproductionになっていると、破壊的なコマンドを実行する前に『本当に実行しますか?』という確認プロンプトが出ます。でも、一番の対策は『本番環境のデータベース接続権限を自分のPCに持たせない』といった仕組み作りですね。」
生徒
「ツールだけでなく、運用のルールも大切なんですね。マイグレーションとシーダーを使いこなして、スムーズな開発ができるように頑張ります!」
先生
「その意気です。次は『Faker』を使って、より本物に近い住所や電話番号を生成する方法も学んでみると面白いですよ。さらにテストが楽しくなります。」