データベース: シーディング¶
はじめに¶
Laravelでは、シードクラスを使用してデータベースにデータをシードする機能が含まれています。すべてのシードクラスは、database/seeders
ディレクトリに保存されます。デフォルトでは、DatabaseSeeder
クラスが定義されています。このクラスから、call
メソッドを使用して他のシードクラスを実行でき、シーディングの順序を制御できます。
Note
マスアサインメント保護は、データベースシーディング中に自動的に無効になります。
シーダーの作成¶
シーダーを生成するには、make:seeder
Artisanコマンドを実行します。フレームワークによって生成されたすべてのシーダーは、database/seeders
ディレクトリに配置されます。
シーダークラスには、デフォルトでrun
メソッドが1つだけ含まれています。このメソッドは、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'),
]);
}
}
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
オプションを使用して、個別に実行する特定のシーダークラスを指定できます。
また、migrate:fresh
コマンドと--seed
オプションを組み合わせてデータベースにシードを実行することもできます。このコマンドは、すべてのテーブルをドロップし、すべてのマイグレーションを再実行します。このコマンドは、データベースを完全に再構築するのに便利です。--seeder
オプションを使用して、実行する特定のシーダーを指定できます。
本番環境でのシーダーの強制実行¶
一部のシーディング操作は、データを変更または失う可能性があります。本番データベースに対してシーディングコマンドを実行することを保護するために、production
環境でシーダーが実行される前に確認を求められます。プロンプトなしでシーダーを強制的に実行するには、--force
フラグを使用します。