イントロダクション
Laravelは、シードクラスを使用してデータベースにデータをシード(種をまく、初期値の設定)する機能を持っています。すべてのシードクラスはdatabase/seeders
ディレクトリに保存します。デフォルトで、DatabaseSeeder
クラスが定義されています。このクラスから、call
メソッドを使用して他のシードクラスを実行し、シードの順序を制御できます。
Note: 複数代入は、データベースのシード中では自動的に無効になります。
シーダクラス定義
シーダを生成するには、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
{
/**
* データベースに対するデータ設定の実行
*/
public function run(): void
{
DB::table('users')->insert([
'name' => Str::random(10),
'email' => Str::random(10).'@gmail.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