Database: Seeding
Introduction
Laravel には、シード クラスを使用してデータベースにデータをシードする機能が含まれています。すべてのシード クラスは、database/seeders ディレクトリに保存されます。デフォルトでは、DatabaseSeeder クラスが定義されています。このクラスから、call メソッドを使用して他のシード クラスを実行し、シード順序を制御できます。
Mass assignment protection は、データベースのシード処理中に自動的に無効になります。
Writing Seeders
シーダーを生成するには、make:seeder Artisan command を実行します。フレームワークによって生成されたすべてのシーダーは、database/seeders ディレクトリに配置されます。
php artisan make:seeder UserSeeder
シーダー クラスには、デフォルトでメソッド run が 1 つだけ含まれています。このメソッドは、db:seed Artisan command が実行されるときに呼び出されます。 run メソッド内では、必要に応じてデータベースにデータを挿入できます。 query builder を使用してデータを手動で挿入することも、Eloquent model factories を使用することもできます。
例として、デフォルトの 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.
*
* @return void
*/
public function run()
{
DB::table('users')->insert([
'name' => Str::random(10),
'email' => Str::random(10).'@gmail.com',
'password' => Hash::make('password'),
]);
}
}
runメソッドのシグネチャ内で必要な依存関係をタイプヒントで指定できます。これらは、Laravel service container を通じて自動的に解決されます。
Using Model Factories
もちろん、各モデル シードの属性を手動で指定するのは面倒です。代わりに、model factories を使用すると、大量のデータベース レコードを簡単に生成できます。まず、model factory documentation を確認して、ファクトリを定義する方法を学びます。
たとえば、各ユーザーが 1 つの関連投稿を持つ 50 人のユーザーを作成してみましょう。
use App\Models\User;
/**
* Run the database seeders.
*
* @return void
*/
public function run()
{
User::factory()
->count(50)
->hasPosts(1)
->create();
}
Calling Additional Seeders
DatabaseSeeder クラス内で、call メソッドを使用して追加のシード クラスを実行できます。 call メソッドを使用すると、単一のシーダー クラスが大きくなりすぎないように、データベース シードを複数のファイルに分割できます。 call メソッドは、実行する必要があるシーダー クラスの配列を受け取ります。
/**
* Run the database seeders.
*
* @return void
*/
public function run()
{
$this->call([
UserSeeder::class,
PostSeeder::class,
CommentSeeder::class,
]);
}
Muting Model Events
シードの実行中、モデルがイベントをディスパッチしないようにしたい場合があります。これは、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.
*
* @return void
*/
public function run()
{
$this->call([
UserSeeder::class,
]);
}
}
Running Seeders
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
Forcing Seeders To Run In Production
シード操作によっては、データが変更されたり失われたりする可能性があります。実稼働データベースに対してシード コマンドを実行しないようにするために、production 環境でシーダーが実行される前に確認を求めるプロンプトが表示されます。プロンプトを表示せずにシーダーを強制的に実行するには、--force フラグを使用します。
php artisan db:seed --force