イントロダクション

シーダー(初期値設定)クラスを使用し、テストデーターをデーターベースに設定するシンプルな方法も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