メインコンテンツまでスキップ

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

はじめに

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

注記

シーダの作成

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

php artisan make:seeder UserSeeder

シーダクラスにはデフォルトで run メソッドのみが含まれています。このメソッドは 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
{
/**
* 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 の サービスコンテナ を介して自動的に解決されます。

モデルファクトリの使用

もちろん、各モデルシードの属性を手動で指定するのは手間がかかります。代わりに、モデルファクトリ を使用して大量のデータベースレコードを便利に生成することができます。まず、ファクトリを定義する方法を学ぶために モデルファクトリのドキュメント を確認してください。

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

    use App\Models\User;

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

追加のシーダーを呼び出す

DatabaseSeeder クラス内で、call メソッドを使用して追加のシードクラスを実行することができます。call メソッドを使用すると、データベースのシーディングを複数のファイルに分割して、1 つのシーダークラスが大きすぎないようにすることができます。call メソッドは、実行するべきシードクラスの配列を受け入れます:

    /**
* Run the database seeders.
*/
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;

/**
* Run the database seeders.
*/
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