サイトを更新しています。 数日間、レイアウトや翻訳に不具合が出ることがあります。ドキュメントは引き続きご利用いただけます。表示が崩れている場合は、後ほど再読み込みしてください。

ホーム Laravel 10.x データベース:シーディング

データベース:シーディング

10.x 2026年3月7日

#はじめに

Laravel はシードクラスを使ってデータベースにデータを投入する機能を備えています。すべてのシードクラスは database/seeders ディレクトリに保存されます。デフォルトで DatabaseSeeder クラスが用意されており、このクラスの call メソッドを使って他のシードクラスを実行し、シーディングの順序を制御できます。

Примечание

データベースシーディング中は 一括代入保護 が自動的に無効になります。

#シーダーの作成

シーダーを生成するには、make:seederArtisanコマンド を実行します。フレームワークで生成されたすべてのシーダーは database/seeders ディレクトリに配置されます。

php artisan make:seeder UserSeeder

シーダークラスはデフォルトで run メソッドのみを持ちます。このメソッドは db:seedArtisanコマンド 実行時に呼び出されます。run メソッド内で自由にデータベースにデータを挿入できます。手動でデータを挿入するには クエリビルダー を使うか、Eloquentモデルファクトリー を利用できます。

例として、デフォルトの DatabaseSeeder クラスを修正し、run メソッドにデータベース挿入文を追加してみましょう。

<?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
{
    /**
     * データベースシーダーを実行します。
     */
    public function run(): void
    {
        DB::table('users')->insert([
            'name' => Str::random(10),
            'email' => Str::random(10).'@example.com',
            'password' => Hash::make('password'),
        ]);
    }
}
Примечание

run メソッドのシグネチャに必要な依存関係をタイプヒントで指定できます。Laravel の サービスコンテナ により自動的に解決されます。

#モデルファクトリーの使用

もちろん、各モデルの属性を手動で指定するのは手間です。代わりに モデルファクトリー を使うと、大量のレコードを簡単に生成できます。まずは モデルファクトリーのドキュメント を確認してファクトリーの定義方法を学びましょう。

例として、50人のユーザーを作成し、それぞれに1件の関連投稿を持たせてみます。

use App\Models\User;

/**
 * データベースシーダーを実行します。
 */
public function run(): void
{
    User::factory()
            ->count(50)
            ->hasPosts(1)
            ->create();
}

#追加シーダーの呼び出し

DatabaseSeeder クラス内で call メソッドを使い、追加のシードクラスを実行できます。call メソッドを使うことで、シーディング処理を複数のファイルに分割でき、1つのシーダークラスが大きくなりすぎるのを防げます。call メソッドは実行するシーダークラスの配列を受け取ります。

/**
 * データベースシーダーを実行します。
 */
public function run(): void
{
    $this->call([
        UserSeeder::class,
        PostSeeder::class,
        CommentSeeder::class,
    ]);
}

#モデルイベントの無効化

シードを実行する際に、モデルがイベントをディスパッチするのを防ぎたいことがあります。これには WithoutModelEvents トレイトを使用できます。WithoutModelEvents トレイトを使用すると、追加のシードクラスが call メソッドで実行されても、モデルイベントがディスパッチされません:

<?php

namespace Database\Seeders;

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

class DatabaseSeeder extends Seeder
{
    use WithoutModelEvents;

    /**
     * データベースシーダーを実行します。
     */
    public function run(): void
    {
        $this->call([
            UserSeeder::class,
        ]);
    }
}

#シーダーの実行

db:seed の Artisan コマンドを実行してデータベースにシードできます。デフォルトでは db:seed コマンドは Database\Seeders\DatabaseSeeder クラスを実行し、さらに他のシードクラスを呼び出します。--class オプションを使うと、特定のシーダークラスだけを個別に実行できます。

php artisan db:seed

php artisan db:seed --class=UserSeeder

migrate:fresh コマンドに --seed オプションを組み合わせて使うこともできます。このコマンドはすべてのテーブルを削除し、マイグレーションを再実行します。データベースを完全に再構築したい場合に便利です。--seeder オプションで特定のシーダーを指定できます。

php artisan migrate:fresh --seed

php artisan migrate:fresh --seed --seeder=UserSeeder 

#本番環境でシーダーを強制実行する

一部のシーディング操作はデータの変更や消失を引き起こす可能性があります。本番データベースに対してシーディングコマンドを誤って実行しないよう保護するため、production 環境でシーダーが実行される前に確認を求められます。プロンプトを表示せずにシーダーを強制的に実行するには、--force フラグを使用します:

php artisan db:seed --force