データベース: シーディング
導入
Laravelには、シーダー クラスを使用してデータベースにデータを投入する機能が含まれています。すべてのシーダー クラスは、database/seeders
ディレクトリに保存されます。デフォルトでは、DatabaseSeeder
クラスが定義されています。このクラスから、call
メソッドを使用して他のシーダー クラスを実行し、シーディングの順序を制御できます。
一括代入保護は、データベース シーディング中は自動的に無効になります。
シーダーの記述
シーダーを生成するには、make:seeder
Artisan コマンドを実行します。フレームワークによって生成されたすべてのシーダーは、database/seeders
ディレクトリに配置されます。
php artisan make:seeder UserSeeder
シーダー クラスには、デフォルトで 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{ /** * 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