本文へ移動
Laravel Tips

シーディング(最初のデータを入れる)

開発用や最初に必要なデータを、データベースへまとめて入れるシーダーの書き方と、db:seed コマンドでの動かし方を説明します。

シーディングは、データベースに最初のデータ(ためしのユーザーや、はじめから必要な設定など)を、プログラムでまとめて入れることです。お店を開く前に、棚に商品を並べておく作業のようなものです。Laravel では、データを入れるためのクラス(シーダー)を書いて、コマンドで動かします。

シーダーのクラスは、すべて database/seeders に置きます。最初から DatabaseSeeder というクラスが用意されていて、その中で call メソッドを使うと、ほかのシーダーを動かせます。動かす順番も、自分で決められます。

補足

シーディングの間は、マスアサインメント(一括代入)の保護が自動で止まります。

シーダーを書く#

シーダーを作るには、make:seeder という Artisan コマンド(php artisan で動かす Laravel のコマンド)を使います。作られたシーダーは、database/seeders に置かれます。

bash
php artisan make:seeder UserSeeder

シーダーのクラスには、最初は run というメソッドが1つだけあります。db:seed コマンドを動かすと、この run が呼ばれます。run の中では、好きなやり方でデータベースにデータを入れられます。クエリビルダで自分で入れることも、ファクトリ(ためしのデータを自動で作るしくみ)を使うこともできます。

例として、最初からある DatabaseSeeder を書き換えて、run にデータを入れる処理を足してみます。

php
<?php

namespace Database\Seeders;

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

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeders.
     */
    public function run(): void
    {
        DB::table('users')->insert([
            'name' => Str::random(10),
            'email' => Str::random(10).'@example.com',
            'password' => Hash::make('password'),
        ]);
    }
}

補足

run メソッドの引数には、必要な部品を型で書いておけます。Laravel のサービスコンテナ(クラスを作って渡してくれる道具箱)が、自動で用意して渡してくれます。

ファクトリを使う#

1つずつ、モデルのデータを手で書くのは大変です。ファクトリを使えば、たくさんのデータを、かんたんに作れます。ファクトリの作り方は、先にファクトリのページで確かめてください。

たとえば、それぞれ記事を1つ持つユーザーを、50人作る例です。

php
use App\Models\User;

/**
 * Run the database seeders.
 */
public function run(): void
{
    User::factory()
        ->count(50)
        ->hasPosts(1)
        ->create();
}

ほかのシーダーを呼ぶ#

DatabaseSeeder の中では、call で、ほかのシーダーを動かせます。1つのシーダーが大きくなりすぎないように、ファイルを分けられます。call には、動かすシーダーのクラスの配列を渡します。

php
/**
 * Run the database seeders.
 */
public function run(): void
{
    $this->call([
        UserSeeder::class,
        PostSeeder::class,
        CommentSeeder::class,
    ]);
}

モデルのイベントを止める#

シーディングの間は、モデルからイベント(「起きた」という知らせ)が出ないようにしたいことがあります。WithoutModelEvents トレイト(クラスに機能を足す部品)を使います。これを使うと、call で別のシーダーを動かしても、モデルのイベントは出ません。

php
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;

class DatabaseSeeder extends Seeder
{
    use WithoutModelEvents;

    /**
     * Run the database seeders.
     */
    public function run(): void
    {
        $this->call([
            UserSeeder::class,
        ]);
    }
}

シーダーを動かす#

データベースにデータを入れるには、db:seed コマンドを動かします。既定では、Database\Seeders\DatabaseSeeder を動かし、そこから、ほかのシーダーが呼ばれます。1つのシーダーだけを動かしたいときは、--class で、クラスを決めます。

bash
php artisan db:seed

php artisan db:seed --class=UserSeeder

migrate:fresh に --seed を付けても、データを入れられます。migrate:fresh は、全部の表を消して、マイグレーションを全部動かし直すので、データベースを丸ごと作り直したいときに便利です。--seeder で、動かすシーダーを決められます。

bash
php artisan migrate:fresh --seed

php artisan migrate:fresh --seed --seeder=UserSeeder
コマンドやオプション 働き
db:seed DatabaseSeeder を動かす
db:seed --class=UserSeeder 決めたシーダーだけを動かす
migrate:fresh --seed 表を作り直してから、シーダーを動かす
--seeder=UserSeeder migrate:fresh --seed で動かすシーダーを決める
--force 本番でも確認なしで動かす

本番で無理やり動かす#

シーディングには、データを変えたり、消したりするものがあります。本番のデータベースで、うっかり動かさないように、production 環境では、動かす前に確認を聞かれます。確認なしで動かすには、--force を付けます。

bash
php artisan db:seed --force

関連するページ#

公式ドキュメント(英語)

2026年10月5日時点の内容をもとに、日本語でまとめています。

ページの一覧