コンテンツへスキップ

データベース: シーディング

導入

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

lightbulb

一括代入保護は、データベース シーディング中は自動的に無効になります。

シーダーの記述

シーダーを生成するには、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'),
]);
}
}
lightbulb

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