データベース: シーディング
はじめに
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