Laravel Seeder 実行方法まとめ|初心者向けに基本コマンドから使い分けまで解説

Laravel入門

Laravelで開発をしていると、初期データやテストデータをまとめて登録したい場面で Seeder(シーダー) を使います。

しかし、「Seederの実行方法が分からない」「コマンドを打ったのに反映されない」と戸惑う初心者は少なくありません。

この記事では、Laravel Seeder 実行の基本から、特定のSeederだけを動かす方法、つまずきやすいポイントまでを順序立てて解説します。
コマンドをそのまま試しながら、開発現場で迷わずSeederを使える状態になることを目指します。

LaravelのSeederとは何か?

Seeder(シーダー)とは、データベースに初期データやテスト用データを自動で投入する仕組みです。Laravelでは標準機能として用意されており、開発効率と再現性を高めるために使われます。

例えば、次のような場面でSeederが役立ちます。

  • 開発環境を作り直したときに、管理者ユーザーや初期設定データをまとめて登録したい
  • テスト用にダミーデータを毎回同じ条件で投入したい
  • チーム開発で、誰が環境を作っても同じ初期データ状態にしたい

よく混同されがちですが、マイグレーションとSeederは役割が異なります。
マイグレーションは「テーブル構造を定義・変更するもの」、Seederは「そのテーブルに入れるデータを定義するもの」です。

テーブルを作るのがマイグレーション、
中身を入れるのがSeeder、
と分けて考えると理解しやすくなります。

Seederファイルの作成方法

Seederを使うには、まず Seederクラスのファイルを作成します。
Laravelでは専用のArtisanコマンドが用意されており、手作業でファイルを作る必要はありません。

Seederを作成するコマンド

以下のコマンドを実行すると、新しいSeederファイルが生成されます。

php artisan make:seeder SampleSeeder

このコマンドを実行すると、database/seeders ディレクトリに
SampleSeeder.php というファイルが作成されます。

Laravel 8以降では、Seederはすべてこの database/seeders 配下で管理されるのが基本です。
以前のバージョンを触ったことがある場合、ディレクトリ構成の違いに注意してください。

クラス名と命名ルールの注意点

Seederのクラス名は 〇〇Seeder という形式にするのが慣例です。
例えば、UsersSeederPostsSeeder のように、
「どのテーブル用のデータか」が分かる名前にすると、後から見返したときに迷いません。

この段階では、まだデータは登録されません。
次のステップで、このSeederファイルに 実際に投入するデータの処理を書いていきます。

Seederの基本的な書き方

Seederファイルを作成したら、次は「どんなデータを入れるか」を run() に書きます。
Seederは run() メソッドが実行されることで、DBにデータが投入される仕組みです。

runメソッドの役割

database/seeders/SampleSeeder.php は、作成直後は次のような形になっています(Laravelのバージョンで細部は多少違います)。

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class SampleSeeder extends Seeder
{
    public function run(): void
    {
        //
    }
}

ここに「insertする処理」や「モデルでcreateする処理」を書くと、Seeder実行時に動きます。
つまり、Seederの流れはシンプルで、

  • Seederを作る
  • run() に登録処理を書く
  • db:seed で実行する

という順番になります。

DBファサードを使った基本例

最も基本的で分かりやすいのが、DB ファサードで直接insertする方法です。

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class SampleSeeder extends Seeder
{
    public function run(): void
    {
        DB::table('users')->insert([
            'name' => 'Sample User',
            'email' => 'sample@example.com',
            'password' => bcrypt('password'),
            'created_at' => now(),
            'updated_at' => now(),
        ]);
    }
}

ポイントは2つです。

  • DB::table('テーブル名')->insert([...]) で1件入れられる
  • created_at / updated_at をテーブルで使っているなら、入れておくと安全

初心者のうちは、まずこの形で「Seederが動く」感覚を掴むのが早いです。

Eloquentモデルを使う場合

Eloquent(モデル)を使って登録することもできます。

<?php

namespace Database\Seeders;

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

class SampleSeeder extends Seeder
{
    public function run(): void
    {
        User::create([
            'name' => 'Sample User',
            'email' => 'sample@example.com',
            'password' => bcrypt('password'),
        ]);
    }
}

ただし注意点があります。
モデル側で fillable / guarded の設定が適切でないと、create() が弾かれて登録できません(Mass Assignmentの制限)。

「Seederを動かしたいだけなのに詰まる」原因になりやすいので、まずは DBファサードで動作確認 → 慣れたらモデル という順番がおすすめです。

Laravel Seederの実行方法(基本)

結論から言うと、Seederの実行は php artisan db:seed です。
ただし実際には「どのSeederが動くのか」を管理する仕組みがあり、ここを理解しておくと混乱しません。

全Seederを実行する方法

php artisan db:seed

このコマンドは、基本的に DatabaseSeeder(親玉のSeeder) を実行します。
「seedと言っているのに SampleSeeder が動かない」と感じる場合、ほぼここが原因です。

DatabaseSeederの役割

database/seeders/DatabaseSeeder.php は、Seederの実行対象をまとめる役割を持っています。
イメージとしては「Seederの実行リスト」を管理するファイルです。

典型的には次のように書きます。

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run(): void
    {
        $this->call([
            SampleSeeder::class,
        ]);
    }
}

ここで重要なのが、$this->call() の意味です。

  • $this->call() に書かれたSeederが実行対象になる
  • php artisan db:seed はまず DatabaseSeeder を動かす
  • その中で call されているSeederが順番に実行される

つまり、db:seed = 全Seeder実行 というより、正確には
「DatabaseSeederに登録されているSeederを実行」 です。

ここまで押さえると、次の「特定のSeederだけ実行」が一気に分かりやすくなります。

特定のSeederだけを実行する方法

初心者が一番よく使う(そして検索意図ど真ん中)なのがこれです。
--class オプションを使えば、目的のSeederだけをピンポイントで実行できます。

php artisan db:seed --class=SampleSeeder

これで SampleSeederrun() だけが実行されます。

開発中は「全Seederを毎回流す」よりも、今直しているSeederだけ何度も試すことが多いので、この形を覚えるのが最短です。
特に、テストデータが多くなってくると db:seed は時間がかかりやすく、部分実行が効きます。

DatabaseSeederに登録しなくても実行できる

ここが重要ポイントです。
--class=SampleSeeder の場合、DatabaseSeederに $this->call() で登録していなくても実行できます。

  • php artisan db:seed → DatabaseSeeder経由(登録が必要)
  • php artisan db:seed --class=SampleSeeder → 直接実行(登録不要)

「SampleSeederを書いたのに動かない」問題は、まずこの2つの違いを理解すると解決しやすくなります。

マイグレーションとSeederを一緒に実行する方法

開発中に「DBを作り直して、初期データも入れ直したい」という場面はよくあります。
そのときに便利なのが migrate:fresh --seed です。

データベースを作り直してSeederを実行

php artisan migrate:fresh --seed

このコマンドは、ざっくり言うと次の流れを一気にやります。

  • 既存テーブルをすべて削除(作り直し)
  • マイグレーションを最初から実行
  • php artisan db:seed を実行(=DatabaseSeeder経由)

つまり、DBを初期化して、Seederでデータ投入まで一括です。

開発環境専用である理由

migrate:fresh は 全テーブルを削除するため、実行するとデータは消えます。
そのため基本的に 本番環境では使わない(使うべきではない)コマンドです。

「ローカルで検証していて、何度もやり直したい」用途に強い反面、
誤って本番DBに向けて実行すると致命的なので、環境の切り替えには細心の注意が必要です。

Seederが実行されないときのよくある原因

「コマンドは打ったのに、データが入っていない」場合は、原因がだいたい決まっています。
初心者がハマりやすい順に確認していくと、切り分けが早いです。

DatabaseSeederで呼び出していない

php artisan db:seed は DatabaseSeeder経由です。
DatabaseSeeder.phpSampleSeeder::class を追加していないと、当然 SampleSeeder は動きません。

$this->call([
    SampleSeeder::class,
]);

一方で、--class を付けた場合は登録不要なので、迷ったら次を試すと切り分けになります。

php artisan db:seed --class=SampleSeeder

クラス名・指定方法のミス

--class の指定は クラス名です。ファイル名やパスではありません。

  • --class=SampleSeeder
  • --class=SampleSeeder.php
  • --class=database/seeders/SampleSeeder

また、Seederを UsersTableSeeder のように作ったのに、--class=UserSeeder のように違う名前で打っているケースも多いです。
実際のクラス宣言(class ○○ extends Seeder) を見て一致させてください。

autoloadが更新されていない

ファイルを追加・移動した後に、クラスが見つからない(Class not found)系のエラーになることがあります。
その場合は composer dump-autoload でオートロードを更新します。

composer dump-autoload

「なぜか認識されない」系のときに効く、定番の対処です。

マイグレーション未実行

Seederはデータを入れるだけなので、そもそも テーブルが存在しないと失敗します。
開発序盤だと「Seederを書いたけど migration をまだ流していない」ことがよくあります。

  • 先に php artisan migrate を実行
  • その後に php artisan db:seed または --class 実行

という順番に戻して確認してください。

本番環境でSeederを実行する際の注意点

本番環境(production)でSeederを実行するのは、基本的には 慎重に考えるべき操作です。
意図しないデータ追加や上書きが起きると、復旧が大変になります。

とはいえ、初期ユーザー作成やマスターデータ投入など、どうしても本番で実行したいケースもあります。
その場合は「安全装置」を理解した上で、最小限の範囲で実行します。

production確認と、うっかり実行のリスク

Laravelは、本番相当の環境で危険なコマンドを実行するときに確認プロンプトが出ることがあります。
ただし、運用環境や実行方法(CI/CDや非対話実行)によっては確認が出ないこともあるため、環境を取り違えないのが第一です。

  • .envAPP_ENV / APP_DEBUG
  • 実行対象のDB接続(DB_HOST / DB_DATABASE
  • 実行しているサーバーが本当に本番か

この3点は、実行前にセットで確認する癖を付けるのが安全です。

–force の意味

本番環境で「確認をスキップして強制実行したい」場合に --force を付けることがあります。

php artisan db:seed --force

--force は、安全のための確認を無視して実行するオプションです。
つまり、便利というより「危険を理解した上で、運用者が責任を持って実行する」ためのものです。

基本方針としては、

  • 本番ではSeederを「常用しない」
  • 実行するなら「対象Seederを絞る(--class)」
  • できれば事前にバックアップを取る

ここまでをセットにしておくと、事故が起きにくくなります。

初心者向けSeeder運用のポイントまとめ

Laravel Seeder 実行で迷わないためのコツは、「目的に合うコマンドを最短で選ぶ」ことです。
特に初心者のうちは、全部を一気に覚えようとせず、よく使う型から固めるのが安定します。

開発でよく使うのは、次の使い分けです。

  • まずは特定Seederだけ実行php artisan db:seed --class=SampleSeeder
    いま作っているSeederの動作確認に最適です。
  • 全Seederをまとめて実行php artisan db:seed
    DatabaseSeederに登録した「いつものセット」を一括投入したいときに使います。
  • DBを作り直して全部入れ直しphp artisan migrate:fresh --seed
    開発環境でやり直したいときに強いですが、データは消えます。

「動かない」ときは、まず db:seed--class の違いを思い出してください。
db:seed は DatabaseSeeder経由、--class は直接実行です。

この切り分けができるだけで、Seederまわりの詰まりどころはかなり減ります。

まとめ

Laravel Seeder 実行で覚えるべきコマンドは、まず3つです。

  • php artisan db:seed(まとめて実行)
  • php artisan db:seed --class=〇〇Seeder(特定だけ実行)
  • php artisan migrate:fresh --seed(作り直して投入)

を押さえるだけで、開発の詰まりが一気に減ります。

特に初心者のうちは、特定Seederだけ実行を起点にすると安全です。
動作確認が速く、DatabaseSeederへの登録漏れで迷うことも減ります。

うまく反映されないときは、DatabaseSeederで呼んでいるか、クラス名の指定が合っているか、autoloadやマイグレーションの状態を順番に確認してください。
この型が身につけば、Seederは「怖い操作」ではなく「開発を速くする道具」になります。

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする

コメント