Web無料相談会2018冬
Web無料相談会2018冬
2018.06.08
#39
バックエンドへの道

『Laravel』のシーディング機能を使ってみる

エリカ

こんにちは、エリカです。

たとえば、拠点コードみたいなものを登録をしたいときや、開発時にテストデータを登録するとき……、「Laravel」では、シーディング機能を使って簡単に用意することができるんです。今回は、その基本的な使用方法を一部ご紹介したいと思います。

クエリビルダを利用して直接テーブルに挿入する場合

名前、メールアドレス、パスワードというカラムを持つusersというテーブルがあったとします。
このテーブルに直接挿入するシーダークラスを作成してみましょう。

御多分にもれず、アルチザンで簡単に雛形を作成することができます。

$ php artisan make:seeder UsersTableSeeder

下記が、database/seeds/UsersTableSeeder.php に作成されます。

<?php

use Illuminate\Database\Seeder;

class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        // ここに挿入する内容を記述
    }
}

ここに下記を記述します。

public function run()
    {
        DB::table('users')->insert([
            'name' => str_random(10),
            'email' => str_random(10).'@gmail.com',
            'password' => bcrypt('secret'),
        ]);
    }

以下のコマンドを実行し、Composerのオートローダを再生し、シーダーを実行可能にします。

$ composer dump-autoload

シーダーを実行します。

$ artisan db:seed --class=UsersTableSeeder

ここで、usersテーブルを確認すると、ランダムな名前、メールアドレス、パスワードでデータが挿入されています。

モデルファクトリを利用する場合

大量に登録する場合は、モデルファクトリを利用して登録すると便利です。
こちらもまずは雛形を作成します。

$ artisan make:factory UserFactory --model=User

下記が、database/factories/UserFactory.php に作成されます。

<?php

use Faker\Generator as Faker;

$factory->define(App\User::class, function (Faker $faker) {
    return [
        // ここに挿入する内容を記述
    ];
});

ここでも名前、メールアドレス、パスワードをランダムに生成します。

return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'password' => Hash::make($faker->password()),
    ];

また、先ほどのシーダークラスの中身をモデルファクトリを利用するように書き換えます。

database/seeds/UsersTableSeeder.php

public function run()
    {
        factory(App\User::class, 100)->create();
    }

シーダーを実行します。

$ artisan db:seed --class=UsersTableSeeder

これで、モデルファクトリを利用して100件のデータが挿入されます。

なお、コンフィグファイルに下記を追記すると日本語でデータが作成されます。

config/app.php
'faker_locale' => 'ja_JP',

シーダーをまとめて実行するには

database/seeds/DatabaseSeeder.php に、実行するシーダーを指定します。

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $this->call(UsersTableSeeder::class);
        $this->call(FooTableSeeder::class);
        $this->call(BarTableSeeder::class);
    }
}

こうすることにより、下記のようなマイグレーションコマンドで、シーダーもまとめて実行することができます。

$ artisan migrate:refresh --seed

まとめ

いかがでしたか? コードを書いて簡単にダミーデータを用意できるのはうれしいですよね!
こうした機能も洗練されているあたり、さすが「Laravel」といったところ。みなさんもぜひ試してみてくださいね。