イントロダクション
シーダ(初期値設定)クラスを使用し、テストデーターをデーターベースに設定するシンプルな方法もLaravelには備わっています。全シーダクラスはdatabase/seeds
に保存します。シーダクラスには好きな名前を付けられます。しかしUsersTableSeeder
などのような分かりやすい規則に従ったほうが良いでしょう。デフォルトとしてDatabaseSeeder
クラスが定義されています。このクラスからcall
メソッドを使い他の初期値設定クラスを呼び出すことで、シーディングの順番をコントロールできます。
シーダクラス定義
シーダを生成するには、make:seeder
Artisanコマンドを実行します。フレームワークが生成するシーダはすべてdatabase/seeds
ディレクトリに設置されます。
php artisan make:seeder UsersTableSeeder
シーダクラスはデフォルトでrun
メソッドだけを含んでいます。このメソッドはdb:seed
Artisanコマンドが実行された時に呼びだされます。run
メソッドの中でデータベースに何でも好きなデーターを挿入できます。クエリビルダでデータを挿入することも、もしくはEloquentモデルファクトリを使うこともできます。
Tip!! データベースシーディング時、複数代入の保護は自動的に無効になります。
例として、Laravelのインストール時にデフォルトで用意されているDatabaseSeeder
クラスを変更してみましょう。run
メソッドにデータベースINSERT文を追加します。
<?php
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
class DatabaseSeeder extends Seeder
{
/**
* データベース初期値設定の実行
*
* @return void
*/
public function run()
{
DB::table('users')->insert([
'name' => Str::random(10),
'email' => Str::random(10).'@gmail.com',
'password' => Hash::make('password'),
]);
}
}
Tip!!
run
メソッドの引数として、タイプヒントにより必要な依存を指定できます。それらはLaravelのサービスコンテナにより、自動的に依存解決されます。
モデルファクトリの利用
もちろんそれぞれのモデルシーダで属性をいちいち指定するのは面倒です。代わりに大量のデータベースレコードを生成するのに便利なモデルファクトリが使用できます。最初にモデルファクトリのドキュメントを読んで、どのように定義するのかを学んでください。ファクトリが定義できれば、データベースにレコードを挿入するfactory
ヘルパ関数が利用できます。
例として50件のレコードを生成し、それぞれのユーザーへリレーションを付加してみましょう。
/**
* データベース初期値設定の実行
*
* @return void
*/
public function run()
{
factory(App\User::class, 50)->create()->each(function ($user) {
$user->posts()->save(factory(App\Post::class)->make());
});
}
追加のシーダ呼び出し
DatabaseSeeder
クラスの中で追加のシーダクラスを呼び出すcall
メソッドが使えます。call
メソッドを使うことで、圧倒されるぐらい大きな1ファイルを使う代わりに、データベースシーディングを複数のファイルへ分割できます。実行したいシーダクラス名を渡します。
/**
* データベース初期値設定の実行
*
* @return void
*/
public function run()
{
$this->call([
UsersTableSeeder::class,
PostsTableSeeder::class,
CommentsTableSeeder::class,
]);
}
シーダの実行
シーダクラスを書き上げたら、Composerのオートローダを再生成するために、dump-autoload
コマンドを実行する必要があります。
composer dump-autoload
データベースへ初期値を設定するためにdb:seed
Artisanコマンドを使用します。デフォルトでdb:seed
コマンドは、他のシーダクラスを呼び出すDatabaseSeeder
クラスを実行します。しかし特定のファイルを個別に実行したい場合は、--class
オプションを使いシーダを指定してください。
php artisan db:seed
php artisan db:seed --class=UsersTableSeeder
もしくはテーブルをすべてドロップし、マイグレーションを再実行するmigrate:fresh
コマンドを使っても、データベースに初期値を設定できます。このコマンドはデータベースを完全に作成し直したい場合に便利です。
php artisan migrate:fresh --seed
実働環境でのシーダの強制実行
シーディング操作ではデータが変更されたり、失われる場合があります。実働環境のデータベースに対してシーディングコマンドが実行されるのを防ぐために、シーダを実行する前に確認のプロンプトが表示されます。プロンプトを出さずにシーダを強行する場合は、--force
フラグを使います。
php artisan db:seed --force