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