カテゴリ: Laravel 更新日: 2026/09/13

Laravelで--seedオプションを使ってマイグレーション後にSeederを実行する方法!初心者でもわかる初期データ登録

Laravelの`--seed`オプションでマイグレーション後にSeederを実行する方法
Laravelの`--seed`オプションでマイグレーション後にSeederを実行する方法

先生と生徒の会話形式で理解しよう

生徒

「先生、Laravelでテーブルを作った後にすぐダミーデータを登録する方法ってありますか?」

先生

「ありますよ。それが--seedオプションです。マイグレーションを実行すると同時にSeederを実行できます。」

生徒

「どうやって使うんですか?」

先生

「コマンドの最後に--seedを付けるだけです。簡単にマイグレーションとデータ登録を同時に行えます。」

1. --seedオプションとは?初心者が知っておくべき役割

1. --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の基本:データベースの設計図とテストデータ

2. マイグレーションとSeederの基本:データベースの設計図とテストデータ
2. マイグレーションとSeederの基本:データベースの設計図とテストデータ

Laravelでデータベースを扱う際、まず理解すべきなのが「マイグレーション(Migration)」「シーダー(Seeder)」という2つの仕組みです。これらを使うことで、プログラミング未経験の方でも、手作業でデータベースを操作するミスを防ぎ、効率的に開発を進めることができます。

マイグレーションとは?(データベースの設計図)

マイグレーションは、いわば「データベースの設計図」です。通常、データベースのテーブル作成は専用の管理画面から行いますが、LaravelではPHPファイルとしてコードで管理します。これにより、チームメンバー全員が同じテーブル構造を簡単に再現できるようになります。

例えば、ユーザー情報を保存する「usersテーブル」を作るための設計図は、コマンド一つで実行可能です。以下のコマンドをターミナルで入力すると、設計図に基づいたテーブルが作成されます。


php artisan migrate

Seederとは?(初期データの自動投入)

テーブルが完成しても、中身が空っぽでは動作確認ができません。そこで役立つのが「Seeder(シーダー)」です。Seederを使うと、テスト用のダミーデータや、システムに必要な初期データ(マスターデータ)を自動で一括登録できます。

Seederファイルはdatabase/seedersディレクトリに保存されており、その中のrun()メソッドに登録したい内容を記述します。未経験の方でも分かりやすい、非常にシンプルなサンプルコードを見てみましょう。

サンプルコード:テストユーザーを1人登録する例


namespace Database\Seeders;

use Illuminate\Database\Seeder;
use App\Models\User;

class UserSeeder extends Seeder
{
    /**
     * データベースにデータを登録する処理
     */
    public function run(): void
    {
        // 1人分のユーザーデータを手動で作成
        User::create([
            'name' => 'テスト太郎',
            'email' => 'test@example.com',
            'password' => bcrypt('password123'), // パスワードを暗号化して保存
        ]);
    }
}

このように、run()の中に「どんなデータを保存したいか」を書くだけで、何度でも同じデータをデータベースに流し込むことが可能になります。開発の準備を自動化する、非常に便利な機能です。

3. Seederを作成・実行する方法:初期データを自動生成する

3. Seederを作成・実行する方法:初期データを自動生成する
3. Seederを作成・実行する方法:初期データを自動生成する

データベースにテスト用のデータを一つずつ手入力するのは非常に時間がかかります。Laravelの「Seeder(シーダー)」機能を使えば、コマンド一つで数百件のサンプルデータを一瞬で作成できます。まずは、データの「種(たね)」となるSeederファイルを作成しましょう。

Seederファイルの作成コマンド

ターミナル(Mac)やコマンドプロンプト(Windows)を開き、プロジェクトのルートディレクトリで以下の職人コマンド(Artisan)を実行します。


php artisan make:seeder UsersTableSeeder
php artisan make:seeder PostsTableSeeder

コマンドを実行すると、database/seedersフォルダの中に新しいPHPファイルが作成されます。作成が成功すると、以下のようなメッセージが表示されます。


INFO  Seeder [database/seeders/UsersTableSeeder.php] created successfully.

run()メソッドへの記述例

作成されたファイルを開くと、run()という名前のメソッドがあります。この中に「どんなデータを追加したいか」を記述します。プログラミング未経験の方でも分かりやすい、最もシンプルな書き方は以下の通りです。


namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB; // DB操作を行うために必要
use Illuminate\Support\Facades\Hash; // パスワードを暗号化するために必要

class UsersTableSeeder extends Seeder
{
    public function run(): void
    {
        // 直接データを1件挿入する例
        DB::table('users')->insert([
            'name' => 'テスト太郎',
            'email' => 'test@example.com',
            'password' => Hash::make('password123'),
        ]);
    }
}

このようにrun()メソッド内に処理を書くことで、後の工程で紹介する「実行コマンド」を叩いた際に、指定したデータがデータベースへ自動的に保存されるようになります。大量のテストデータが必要な場合は、ここで「Factory」という機能を呼び出すのが一般的です。

4. DatabaseSeederで複数のSeederを一括実行する

4. DatabaseSeederで複数のSeederを一括実行する
4. DatabaseSeederで複数のSeederを一括実行する

Laravelで開発を進めると、「ユーザーデータ」「投稿データ」「カテゴリーデータ」など、作成するSeederの数が増えていきます。これらを一つずつコマンドで実行するのは手間がかかりますし、実行漏れの原因にもなります。

そこで便利なのが、database/seeders/DatabaseSeeder.phpです。このファイルは、いわば「Seederの司令塔」のような役割を果たします。call()メソッドの中に実行したいSeederクラスを並べるだけで、ボタン一つ(コマンド一つ)ですべてのテストデータを準備できるようになります。

DatabaseSeederの記述例

プログラミング初心者の方でも分かりやすいよう、ユーザーと投稿のデータを順番に作成するシンプルな例を見てみましょう。$this->call()の中に、作成したクラス名を配列形式で記述します。


namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * アプリケーションのデータベースに対するシーディングの実行
     */
    public function run(): void
    {
        // callメソッドを使って、実行したいSeederを順番に指定します
        $this->call([
            UserSeeder::class,  // 最初にユーザーを作成
            PostSeeder::class,  // 次にそのユーザーに紐づく投稿を作成
        ]);
    }
}

このようにまとめておけば、あとは下記のコマンドを一度叩くだけで、配列に書かれた順番通りにデータが自動生成されます。順番が重要なデータ(例:親データの後に子データを作る場合など)も、この記述順を変えるだけで制御できるので非常に管理が楽になります。


php artisan db:seed
    

実行後、「Database seeding completed successfully.」と表示されれば一括登録は完了です。これにより、チーム開発や本番環境へのデプロイ時でも、常に同じ初期データを簡単に再現できるようになります。

5. migrate:freshと--seedの組み合わせ

5. migrate:freshと--seedの組み合わせ
5. migrate:freshと--seedの組み合わせ

新しい開発環境でテーブルを作り直し、すぐにSeederを実行したい場合はmigrate:fresh--seedを組み合わせます。


php artisan migrate:fresh --seed

このコマンドで、まず既存のテーブルを削除してマイグレーションを実行し、その後DatabaseSeederを使ってまとめてデータが登録されます。

6. 実行手順のイメージ

6. 実行手順のイメージ
6. 実行手順のイメージ

手順を簡単にまとめると次の通りです。

  1. Seederを作成する(php artisan make:seeder
  2. DatabaseSeederでcall()を使ってまとめる
  3. php artisan migrate:fresh --seedでマイグレーションとSeederを同時実行

これで、開発用の初期データが一括で用意できます。

7. 注意点

7. 注意点
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による一括管理のメリット

プロジェクトが大きくなると、CategoriesTableSeederProductsTableSeederOrdersTableSeederのように、シーダークラスの数はどんどん増えていきます。これらをバラバラに実行するのは現実的ではありません。 そこで、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)データがまだ存在しない場合にエラーが起きます。DatabaseSeedercallメソッドに書く順番を、親テーブルから子テーブルの順に並び替えてみてください。」

生徒

「なるほど、順番も大事なんですね。DatabaseSeeder.phpでしっかり交通整理をするイメージですね。あともう一つ、本番環境で間違えてmigrate:fresh --seedを打たないか心配なのですが……。」

先生

「Laravelでは、.envファイルのAPP_ENVproductionになっていると、破壊的なコマンドを実行する前に『本当に実行しますか?』という確認プロンプトが出ます。でも、一番の対策は『本番環境のデータベース接続権限を自分のPCに持たせない』といった仕組み作りですね。」

生徒

「ツールだけでなく、運用のルールも大切なんですね。マイグレーションとシーダーを使いこなして、スムーズな開発ができるように頑張ります!」

先生

「その意気です。次は『Faker』を使って、より本物に近い住所や電話番号を生成する方法も学んでみると面白いですよ。さらにテストが楽しくなります。」

関連記事:
カテゴリの一覧へ
新着記事
New1
PHP
PHPで日本語の曜日を表示する方法を解説!配列を使った曜日変換の定番コード
New2
Symfony
Symfonyでバリデーションエラーを表示する方法!初心者でもわかるテンプレート活用術
New3
Laravel
Laravelのマイグレーションエラーの原因と解決方法を完全ガイド
New4
Laravel
Laravelのrefreshとfreshの違いを初心者でもわかる解説
人気記事
No.1
Java&Spring記事人気No1
Laravel
Laravelのインストール方法まとめ!ComposerとLaravel Installerの使い方
No.2
Java&Spring記事人気No2
Laravel
Laravel通知機能の決定版!特定のユーザーにのみ通知を送る認可制御を初心者向けに徹底解説
No.3
Java&Spring記事人気No3
Laravel
Laravelのルーティングの基本構文と書き方をやさしく解説!初心者でも理解できるWebルートの仕組み
No.4
Java&Spring記事人気No4
Laravel
Laravelのプロジェクト構造を理解しよう!初心者向けディレクトリ解説
No.5
Java&Spring記事人気No5
Laravel
Laravelでログを出力する方法(Monolog・storage/logs)
No.6
Java&Spring記事人気No6
Laravel
LaravelのBlade構文まとめ!@if @foreach など基本ディレクティブ解説
No.7
Java&Spring記事人気No7
Laravel
Laravelのエラー画面をカスタマイズする方法!errors/xxx.blade.phpの使い方を初心者向けに解説
No.8
Java&Spring記事人気No8
Laravel
Laravelメール送信ログの保存と確認方法を完全解説!Mail::fakeとログ出力の使い方