Laravel勉強会[06]~Seeder~

Seeder

テストデータをデータベースに設定するための機能。シーダークラスはdatabase/seedsに保存する。
デフォルトでDatabaseSeederクラスが定義されている。このクラスからcallメソッドで他のシーダークラスを呼び出すことで、シーディングの順番をコントロールできる。

テーブル名について

今回の作業をするにあたって、テーブル名の最後にsをつけたほうが都合がよい。
例えば、テーブル:hoges , データ(1レコード):hoge のようなイメージ。

シーダークラスの生成

$ php artisan make:seeder HogesTableSeeder

シーダークラスを利用するためにはDatabaseSeederクラスに呼び出したいクラスを追加します。

public function run ()
{
    $this->call(HogesTableSeeder::class);
}

シーダーの実行

// DataBaseSeederを実行する
$ php artisan db:seed
// 特定のファイルを個別に実行する
$ php artisan db:seed --class=HogesTableSeeder

データベースを完全に再作成したい場合は以下のコマンドが便利。

$ php artisan migrate:refresh --seed

シーダーの編集

HogesTableSeeder.php

public function run()
{
    //
    $now = \Carbon\Carbon::now();
    for ($i = 1; $i <= 10; $i++) {
        $hoge = [
            'name' => 'user' . $i,
            'mail' => 'user' . $i . '@localhost',
            'created_at' => $now,
            'updated_at' => $now,
        ];
        DB::table('hoges')->insert($hoge);
    }
}

Faker

より現実に近いテストデータを簡単に作成できるライブラリ。

作成できるダミーデータは主に次の通り。

項目名 出力データ
name 氏名
email メールアドレス
safeEmail メールアドレス
password パスワード
address 住所
phoneNumber 電話番号
company 企業名
realText テキスト
// 初期化
$faker = Faker\Factory::create('ja_JP');
// データの取得
$faker->name
$faker->email

Fakerの生成するデータのロケールを変更したい場合、設定ファイルでも変更できる。
config/app.php に以下を追加する。

    'faker_locale' => 'ja_JP',

Factory

大量のデータベースレコードを作成するのに便利。

モデルクラスを作成する。app配下にHoge.phpが作成される。

$ php artisan make:model Hoge

ファクトリークラスを作成する。database/factoriesフォルダにHogeFactory.phpが作成される。

$ php artisan make:factory HogeFactory

HogeFactory.phpの編集。

<?php

use Faker\Generator as Faker;

$factory->define(App\Hoge::class, function (Faker $faker) {
    $now = \Carbon\Carbon::now();
    return [
        //
        'name' => $faker->name,
        'mail' => $faker->email,
        'comment' => $faker->realText,
        'created_at' => $now,
        'updated_at' => $now,
    ];
});

HogesTableSeeder.phpの編集。

<?php
use Illuminate\Database\Seeder;

class HogesTableSeeder extends Seeder
{
    public function run ()
    {
        // 50レコード作成する
        factory (\App\Hoge::class, 50)->create();
    }
}

DatabaseSeeder.phpの編集。

<?php
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run ()
    {
        $this->call(HogesTableSeeder::class);
    }
}

実行。

$ php artisan db:seed

以上です。

参考

  • 竹澤勇貴・栗生和明・新原雅司・大村創太郎(2018)『PHPフレームワーク Laravel Webアプリケーション開発 バージョン5.5LTS対応』ソシム
  • Laravel Document