はじめに
Laravel には、シードクラスを使用してデータベースにデータをシードする機能が含まれています。すべてのシードクラスは database/seeders
ディレクトリに保存されます。デフォルトでは、DatabaseSeeder
クラスが定義されています。このクラスから、call
メソッドを使用して他のシードクラスを実行でき、シーディングの順序を制御できます。
マスアサインメント保護 は、データベースのシーディング中に自動的に無効になります。
シーダーの作成
シーダーを生成するには、make:seeder
Artisan コマンドを実行します。フレームワークによって生成されたすべてのシーダーは、database/seeders
ディレクトリに配置されます:
php artisan make:seeder UserSeeder
シーダークラスには、デフォルトで1つのメソッド 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 サービスコンテナを介して解決されます。
モデルファクトリの使用
もちろん、各モデルシードの属性を手動で指定するのは面倒です。その代わりに、モデルファクトリを使用して、大量のデータベースレコードを便利に生成できます。まず、モデルファクトリのドキュメントを確認して、ファクトリの定義方法を学びましょう。
例えば、1つの関連投稿を持つ50人のユーザーを作成してみましょう:
use App\Models\User;
/**
* Run the database seeders.
*/
public function run(): void
{
User::factory()
->count(50)
->hasPosts(1)
->create();
}
追加シーダーの呼び出し
DatabaseSeeder
クラス内で、call
メソッドを使用して追加のシードクラスを実行できます。call
メソッドを使用すると、データベースのシーディングを複数のファイルに分割できるため、単一のシーダークラスが大きくなりすぎることはありません。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