はじめに

Laravel には、シードクラスを使用してデータベースにデータをシードする機能が含まれています。すべてのシードクラスは database/seeders ディレクトリに保存されます。デフォルトでは、DatabaseSeeder クラスが定義されています。このクラスから、call メソッドを使用して他のシードクラスを実行でき、シーディングの順序を制御できます。

マスアサインメント保護 は、データベースのシーディング中に自動的に無効になります。

シーダーの作成

シーダーを生成するには、make:seeder Artisan コマンドを実行します。フレームワークによって生成されたすべてのシーダーは、database/seeders ディレクトリに配置されます:

  1. php artisan make:seeder UserSeeder

シーダークラスには、デフォルトで1つのメソッド run のみが含まれています。このメソッドは、db:seed Artisan コマンドが実行されるときに呼び出されます。run メソッド内では、データベースにデータを挿入する方法は自由です。手動でデータを挿入するために クエリビルダー を使用することも、Eloquent モデルファクトリ を使用することもできます。

例として、デフォルトの DatabaseSeeder クラスを修正し、run メソッドにデータベース挿入文を追加してみましょう:

  1. <?php
  2. namespace Database\Seeders;
  3. use Illuminate\Database\Seeder;
  4. use Illuminate\Support\Facades\DB;
  5. use Illuminate\Support\Facades\Hash;
  6. use Illuminate\Support\Str;
  7. class DatabaseSeeder extends Seeder
  8. {
  9. /**
  10. * Run the database seeders.
  11. */
  12. public function run(): void
  13. {
  14. DB::table('users')->insert([
  15. 'name' => Str::random(10),
  16. 'email' => Str::random(10).'@example.com',
  17. 'password' => Hash::make('password'),
  18. ]);
  19. }
  20. }

run メソッドのシグネチャ内で必要な依存関係をタイプヒントすることができます。それらは自動的に Laravel サービスコンテナを介して解決されます。

モデルファクトリの使用

もちろん、各モデルシードの属性を手動で指定するのは面倒です。その代わりに、モデルファクトリを使用して、大量のデータベースレコードを便利に生成できます。まず、モデルファクトリのドキュメントを確認して、ファクトリの定義方法を学びましょう。

例えば、1つの関連投稿を持つ50人のユーザーを作成してみましょう:

  1. use App\Models\User;
  2. /**
  3. * Run the database seeders.
  4. */
  5. public function run(): void
  6. {
  7. User::factory()
  8. ->count(50)
  9. ->hasPosts(1)
  10. ->create();
  11. }

追加シーダーの呼び出し

DatabaseSeeder クラス内で、call メソッドを使用して追加のシードクラスを実行できます。call メソッドを使用すると、データベースのシーディングを複数のファイルに分割できるため、単一のシーダークラスが大きくなりすぎることはありません。call メソッドは、実行すべきシーダークラスの配列を受け取ります:

  1. /**
  2. * Run the database seeders.
  3. */
  4. public function run(): void
  5. {
  6. $this->call([
  7. UserSeeder::class,
  8. PostSeeder::class,
  9. CommentSeeder::class,
  10. ]);
  11. }

モデルイベントのミュート

シードを実行している間、モデルがイベントを発信するのを防ぎたい場合があります。これは、WithoutModelEvents トレイトを使用して実現できます。使用すると、WithoutModelEvents トレイトは、call メソッドを介して追加のシードクラスが実行されても、モデルイベントが発信されないことを保証します:

  1. <?php
  2. namespace Database\Seeders;
  3. use Illuminate\Database\Seeder;
  4. use Illuminate\Database\Console\Seeds\WithoutModelEvents;
  5. class DatabaseSeeder extends Seeder
  6. {
  7. use WithoutModelEvents;
  8. /**
  9. * Run the database seeders.
  10. */
  11. public function run(): void
  12. {
  13. $this->call([
  14. UserSeeder::class,
  15. ]);
  16. }
  17. }

シーダーの実行

データベースをシードするには、db:seed Artisan コマンドを実行できます。デフォルトでは、db:seed コマンドは Database\Seeders\DatabaseSeeder クラスを実行し、それが他のシードクラスを呼び出すことがあります。ただし、--class オプションを使用して、特定のシーダークラスを個別に実行することもできます:

  1. php artisan db:seed
  2. php artisan db:seed --class=UserSeeder

また、migrate:fresh コマンドを --seed オプションと組み合わせて使用することで、すべてのテーブルを削除し、すべてのマイグレーションを再実行することができます。このコマンドは、データベースを完全に再構築するのに便利です。--seeder オプションを使用して、実行する特定のシーダーを指定できます:

  1. php artisan migrate:fresh --seed
  2. php artisan migrate:fresh --seed --seeder=UserSeeder

本番環境でのシーダーの強制実行

一部のシーディング操作は、データを変更または失う原因となる場合があります。本番データベースに対してシーディングコマンドを実行するのを防ぐために、production 環境でシーダーが実行される前に確認を求められます。プロンプトなしでシーダーを実行するには、--force フラグを使用します:

  1. php artisan db:seed --force