テスト環境で機能の確認、コードの動作確認を行うために簡単にテーブルにダミーデータを挿入することができると作業の効率化に繋がります。LaravelではSeeding機能を使用することによってダミーデータを簡単にテーブルに挿入することが可能です。

Seedingの設定について

Laravleでは、Userテーブルにダミーデータを挿入するSeedingの設定はインストール直後の段階で90%以上完了しています。Laravelのマニュアルを読んでも最初は混乱するかもしれませんが、一度Userテーブルを利用してSeedingを実行してみると操作方法をすぐに理解することができます。一度自分の手で実行することがSeedingを理解する上で一番の近道です。

データベース、Usersテーブルが作成されていない場合は、sqliteを使ってUsersテーブルを作成することができます。

Seederクラスの作成

ダミーデータを作成するためには、ダミーデータを作成するクラスを作成する必要があります。そのクラスのことをLaravelではSeederと呼びます。

php artisan make:seederコマンドでSeederの作成を行います。


laravel $ php artisan make:seeder UsersTableSeeder
Seeder created successfully.

make:seederコマンドを実行するとUsersTableSeederクラスがdatabase/seedsディレクトリに作成されます。

seedsディレクトリ

seedsディレクトリ

Seederクラスのrunメソッドの設定

UsersTableSeederクラスのrunメソッドに下記の1行を追加します。この1行を追加することによって、UsersTableSeederのrunメソッドが実行されるとUserテーブルにダミーデータ10件分が挿入されます。

UserTableSeederクラスのrunメソッドにデータベースへのinsert文を直接記述することもできますが、一度に複数のダミーデータを簡単に作成できるUserFactory.phpファイルを利用します。このファイルはLaravelで事前に準備されています。


<?php

use Illuminate\Database\Seeder;

class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $users = factory(AppApp\User::class, 10)->create();
    }
}

UserFactory.phpファイル(Model Factory)

$users = factory(User::class, 10)->create()で実行される処理の内容は、database/factoriesディレクトリにあるUserFactory.phpに記載されています。UserFactory.phpはfakerやランダム関数等を利用して、ダミーのデータを作成するクラスです。このクラスのことをModel Factory(モデルファクトリー)と呼びます。


<?php

use Faker\Generator as Faker;

$factory->define(App\User::class, function (Faker $faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'email_verified_at' => now(),
        'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
        'remember_token' => str_random(10),
    ];
});

$faker->nameによってランダムなダミーな名前が付けられます。

DatabaseSeederの設定

作成したUserTableSeederクラスを呼び出すDatabaseSeederの設定を行います。DatabaseSeeder.phpファイルは、database/seedsディレクトリにあります。runメソッドがインストール直後ではコメントアウトされているので、それを外します。


<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call(UsersTableSeeder::class);
    }
}

Seedの実行

ダミーデータを作成するための準備が整ったので、php artisan db:seedコマンドを実行します。コマンド実行後に表示されている通り、UsersTableSeederが実行され、seedingが成功しています。


laravel $ php artisan db:seed
Seeding: UsersTableSeeder
Database seeding completed successfully.

php artisan db:seedを実行後、ReflectionException : Class UsersTableSeeder does not existのエラーが出た場合は、composer dump-autoloadを実行してください。

テーブルを再作成する際にダミーデータを挿入することもできます。その場合は、php artisan migrate:refreshコマンドに–seedをつけて実行します。


laravel $ php artisan migrate:refresh --seed
Rolling back: 2014_10_12_100000_create_password_resets_table
Rolled back:  2014_10_12_100000_create_password_resets_table
Rolling back: 2014_10_12_000000_create_users_table
Rolled back:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table
Seeding: UsersTableSeeder
Database seeding completed successfully.

Seedingの一連の流れ

php artisan db:seedを実行するSeedingに関連するファイルを図にすると下記となります。

本文書で利用したファイルは、DatabaseSeeder.php、UserTableSeeder.php, UserFactory.phpの3つのファイルです。userテーブルだけではなく、他のテーブル(例えばpostテーブル)にもダミーデータを挿入したい場合は、PostTableSedder.phpやPostFactory.phpを作成し、DatabaseSeeder.phpからPostTableSeeder.phpを呼び出すことで行うことができます。

Seedingの流れ

Seedingの流れ


UserTableSeeder.phpに直接ダミーデータ作成のコードを記述することができます。その場合は、Factoryは必要ありません。

ダミーデータが作成されたかの確認

Usersテーブルにダミーデータが10件登録されているのか確認してみましょう。php artisan tinkerを使用します。データが表示されれば、Seedingの処理は成功です。


laravel $ php artisan tinker
Psy Shell v0.9.9 (PHP 7.1.16 — cli) by Justin Hileman
>>> $users = App\User::all();
=> Illuminate\Database\Eloquent\Collection {#2928
     all: [
       App\User {#2929
         id: "1",
         name: "Ms. Victoria Auer",
         email: "lbradtke@example.net",
         email_verified_at: "2018-12-19 07:33:11",
         created_at: "2018-12-19 07:33:11",
         updated_at: "2018-12-19 07:33:11",
       },


まとめ

ここまでの読み進めた方はuserテーブルへのダミーデータへの挿入は簡単にできるようになったかと思います。今回は単独テーブルでのデータ挿入でしたが、次回は関連のある複数のテーブルでのSeedingについて説明を行いたいと思います。