#はじめに
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
{
/**
* データベースシーダーを実行します。
*/
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