イントロダクション

シーダ(初期値設定)クラスを使用し、テストデーターをデーターベースに設定するシンプルな方法もLaravelには備わっています。全シーダクラスはdatabase/seedsに保存します。シーダクラスには好きな名前を付けられます。しかしUsersTableSeederなどのような分かりやすい規則に従ったほうが良いでしょう。デフォルトとしてDatabaseSeederクラスが定義されています。このクラスからcallメソッドを使い他の初期値設定クラスを呼び出すことで、シーディングの順番をコントロールできます。

シーダクラス定義

シーダーを生成するには、make:seeder Artisanコマンドを実行します。フレームワークが生成するシーダーは全てdatabase/seedsディレクトリーに設置されます。

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()
{
    $this->call(UsersTableSeeder::class);
    $this->call(PostsTableSeeder::class);
    $this->call(CommentsTableSeeder::class);
}

シーダの実行

シーダクラスを書き上げたら、データベースへ初期値を設定するためにdb:seed Artisanコマンドが使えます。デフォルトでdb:seedコマンドは、他のシーダクラスを呼び出すDatabaseSeederクラスを実行します。しかし特定のファイルを個別に実行したい場合は、--classオプションを使いシーダを指定してください。

php artisan db:seed

php artisan db:seed --class=UsersTableSeeder

もしくはマイグレーションをロールバックし再実行するmigrate:refreshコマンドを使っても、データベースに初期値を設定できます。このコマンドはデータベースを完全に作成し直したい場合に便利です。

php artisan migrate:refresh --seed