Skip to content

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

はじめに

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

Note

マスアサインメント保護は、データベースシーディング中に自動的に無効になります。

シーダーの作成

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

php artisan make:seeder UserSeeder

シーダークラスには、デフォルトでrunメソッドが1つだけ含まれています。このメソッドは、db:seed Artisanコマンドが実行されるときに呼び出されます。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'),
        ]);
    }
}

Note

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

モデルファクトリの使用

もちろん、各モデルのシードの属性を手動で指定するのは面倒です。代わりに、モデルファクトリを使用して、大量のデータベースレコードを簡単に生成できます。まず、モデルファクトリのドキュメントを参照して、ファクトリを定義する方法を学んでください。

例えば、それぞれが1つの関連する投稿を持つ50人のユーザーを作成しましょう。

use App\Models\User;

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

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

DatabaseSeederクラス内で、callメソッドを使用して追加のシードクラスを実行できます。callメソッドを使用すると、データベースシーディングを複数のファイルに分割でき、単一のシーダークラスが大きくなりすぎないように制御できます。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

ユーザーノート