データベース:シーディング
イントロダクション
Laravelは、シードクラスを使用してデータベースにデータを投入する機能を提供しています。すべてのシードクラスはdatabase/seedersディレクトリに保存されます。デフォルトで、DatabaseSeederクラスが定義されています。このクラスから、callメソッドを使用して他のシードクラスを実行し、シーディングの順序を制御できます。
複数代入の保護は、データベースシーディング中に自動的に無効になります。
シーダークラスの作成
シーダーを生成するには、make:seeder Artisanコマンドを実行します。フレームワークによって生成されたすべてのシーダーは、database/seedersディレクトリに配置されます。
1php artisan make:seeder UserSeeder
シーダークラスには、デフォルトでrunメソッドが1つだけ含まれています。このメソッドは、db:seed Artisanコマンドが実行されると呼び出されます。runメソッド内で、データベースに好きなようにデータを挿入できます。クエリビルダを使用して手動でデータを挿入することも、Eloquentモデルファクトリを使用することもできます。
例として、デフォルトのDatabaseSeederクラスを変更し、runメソッドにデータベース挿入ステートメントを追加してみましょう。
1<?php 2 3namespace Database\Seeders; 4 5use Illuminate\Database\Seeder; 6use Illuminate\Support\Facades\DB; 7use Illuminate\Support\Facades\Hash; 8use Illuminate\Support\Str; 9 10class DatabaseSeeder extends Seeder11{12 /**13 * Run the database seeders.14 */15 public function run(): void16 {17 DB::table('users')->insert([18 'name' => Str::random(10),19 'email' => Str::random(10).'@example.com',20 'password' => Hash::make('password'),21 ]);22 }23}
runメソッドのシグネチャ内で必要な依存関係をタイプヒントで指定できます。それらはLaravelのサービスコンテナを介して自動的に解決されます。
モデルファクトリの使用
もちろん、各モデルのシードの属性を手動で指定するのは面倒です。代わりに、モデルファクトリを使用すると、大量のデータベースレコードを便利に生成できます。まず、モデルファクトリのドキュメントを確認して、ファクトリの定義方法を学んでください。
例として、それぞれが1つの関連投稿を持つ50人のユーザーを作成してみましょう。
1use App\Models\User; 2 3/** 4 * Run the database seeders. 5 */ 6public function run(): void 7{ 8 User::factory() 9 ->count(50)10 ->hasPosts(1)11 ->create();12}
追加シーダーの呼び出し
DatabaseSeederクラス内で、callメソッドを使用して追加のシードクラスを実行できます。callメソッドを使用すると、データベースシーディングを複数のファイルに分割できるため、単一のシーダークラスが大きくなりすぎるのを防げます。callメソッドは、実行すべきシーダークラスの配列を引数に取ります。
1/** 2 * Run the database seeders. 3 */ 4public function run(): void 5{ 6 $this->call([ 7 UserSeeder::class, 8 PostSeeder::class, 9 CommentSeeder::class,10 ]);11}
モデルイベントの抑制
シード実行中に、モデルがイベントをディスパッチしないようにしたい場合があります。これはWithoutModelEventsトレイトを使用して実現できます。WithoutModelEventsトレイトを使用すると、callメソッドを介して追加のシードクラスが実行された場合でも、モデルイベントがディスパッチされないようにします。
1<?php 2 3namespace Database\Seeders; 4 5use Illuminate\Database\Seeder; 6use Illuminate\Database\Console\Seeds\WithoutModelEvents; 7 8class DatabaseSeeder extends Seeder 9{10 use WithoutModelEvents;11 12 /**13 * Run the database seeders.14 */15 public function run(): void16 {17 $this->call([18 UserSeeder::class,19 ]);20 }21}
シーダーの実行
db:seed Artisanコマンドを実行して、データベースにデータを投入(シード)できます。デフォルトでは、db:seedコマンドはDatabase\Seeders\DatabaseSeederクラスを実行し、これが他のシードクラスを呼び出す場合があります。しかし、--classオプションを使用して、特定のシーダークラスを個別に実行するように指定することもできます。
1php artisan db:seed2 3php artisan db:seed --class=UserSeeder
また、migrate:freshコマンドと--seedオプションを組み合わせてデータベースにシードすることもできます。これにより、すべてのテーブルが削除され、すべてのマイグレーションが再実行されます。このコマンドは、データベースを完全に再構築するのに役立ちます。--seederオプションを使用して、実行する特定のシーダーを指定できます。
1php artisan migrate:fresh --seed2 3php artisan migrate:fresh --seed --seeder=UserSeeder
本番環境でのシーダーの強制実行
シーディング操作によっては、データが変更されたり失われたりする可能性があります。本番データベースに対してシーディングコマンドを実行するのを防ぐため、production環境でシーダーを実行する前に確認を求められます。プロンプトなしでシーダーを強制的に実行するには、--forceフラグを使用します。
1php artisan db:seed --force