Laravel

【Laravel】 Seeder・ModelFactory・Fakerを使用し日本語のダミーデータを作成する方法

タクマ

こんにちは!タクマです。

31歳未経験からエンジニア転職に成功し、

2021年3月より都内の受託開発企業にてサーバーサイドエンジニアとして働いており、

PHP/Laravel、Vue.jsを使用し開発をしています。

今回はSeeder・ModelFactory・Fakerで日本語のダミーデータを作成する方法を解説していきます。

・ダミーデータってどうやって作るの?

という方はこの記事を最後まで読めば解決できますので、ぜひ最後まで読んでください。

また、ポートフォリオ作成中の方は、ポートフォリオにダミーデータを入れる際に役に立つ情報になりますので、ぜひ最後まで読んでください!

では順番に解説していきます。

用語解説

そもそもSeeder・ModelFactory・Fakerを知らない方のために、この3つがどんなものなのか解説します。

Seeder

Seeder(シーダー)はデータベースにダミーデータを一斉に挿入する機能になります。

Seeder(シーダー)とは英語で種をまく人という意味になります。

参考資料 (Laravel 8.x データベース:シーディング)

ModelFactory

ModelFactory(モデルファクトリー)モデル(テーブル)の各フィールド(各カラム)に入る値を定義します。

定義したFactoryをSeederから呼び出すことで、ダミーデータを生成します。

参考資料 (Laravel 8.x リリースノート:モデルファクトリ)

Faker

Faker(フェイカー)は、ダミーデータを自動生成するためのライブラリになります。

ModelFactory(モデルファクトリー)で値を定義する際に使用します。

 前提条件

  • Laravel8
  • Userモデルのダミーデータを作成するものとする

マイグレーションファイルを作成

今回はUserモデルのダミーデータを作成しますので、Laravelにデフォルトで入っているUsersテーブルのマイグレーションファイルを使用します。

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->smallInteger('age')->comment('年齢');  //この行を追加
            $table->string('email')->unique();
            $table->smallInteger('gender')->comment('性別');  //この行を追加
            $table->text('introduction')->comment('自己紹介');  //この行を追加
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

マイグレーションファイルを書き終わったら、マイグレーションを実行します。

php artisan migrate

Factoryファイルを作成

こちらもLaravelにデフォルトで入っているapp/database/factories/UserFactory.phpを使用しますが、仮に他のモデルで作成するとしたら下記のartisanコマンドで作成することができます。

// Postモデルのファクトリーファイルを作成
php artisan make:factory PostFactory  

UserFactory.phpを編集します。

<?php

namespace Database\Factories;

use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;
use Carbon\Carbon;  //この行を追加

class UserFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = User::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        $now = Carbon::now();  //この行を追加
        return [
            'name' => $this->faker->name,
            'age' => $this->faker->numberBetween(18,80),  //この行を追加
            'email' => $this->faker->unique()->safeEmail,
            'gender' => $this->faker->numberBetween(1,2),  //この行を追加
            'introduction' => $this->faker->realText(20),  //この行を追加
            'email_verified_at' => now(),
            'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
            'remember_token' => Str::random(10),
            'created_at' => $now,  //この行を追加
            'updated_at' => $now,  //この行を追加
        ];
    }
}

$this->faker->numberBetween(18,80)と書いていますが、これは第一引数から第二引数までの数字をランダムで生成するというメソッドになります。

つまり例で言うと18から80までの年齢でユーザが作成されるということになります。

また、性別は男性が1、女性が2という整数値で登録するため、numberBetween(1,2)と書いています。

次に$this->faker->realText(20)と書いていますが、これは引数の文字数で文章を生成するというメソッドです。

引数を設定しない場合、200文字となります。また、最大も200文字です。

次に$this->faker->unique()->safeEmailです。

unique()は一意という意味で他と被らないものになります。なのでunique()を付ければ同じメールアドレスは作成されなくなります。

safeEmailはドメインが実在しないexample.comやexample.netといったものになります。

これをsafeEmailではなくemailとしてしまうとgmail.comなどといった存在するドメインで作成されてしまいます。

なのでメールアドレスのダミーデータを作成するときは、safeEmailを使用するのが安全です。

Fakerのメソッドは他にもたくさんあります。

他のメソッドをチェックしたい方はこの記事 ([Laravel5.1]Fakerチートシート) が参考になります。

Seederへの登録

先ほど作成したFactoryファイルをSeederに登録します。

こちらもLaravelにデフォルトで入っている/seeders/UserSeeder.php.phpを使用しますが、仮に他のモデルで作成するとしたら下記のartisanコマンドで作成することができます。

// PostモデルのSeederを作成
php artisan make:seeder PostSeeder  

UserSeeder.phpを編集します。

<?php

namespace Database\Seeders;

use App\Models\User;
use Illuminate\Database\Seeder;

class UserSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        User::factory()->count(20)->create();  //この行を追加
    }
}

User::factory()->count(20)->create();この部分のcount(20)とすることで、20件のダミーデータが生成されることになります。

次にDatabaseSeederファイルにこのUserSeederを登録します。

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    // ここから追加
    private const SEEDERS = [
        UserSeeder::class, 
    ];
    // ここまで

    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        // ここから追加
        foreach(self::SEEDERS as $seeder) {
            $this->call($seeder);
        }
        // ここまで
    }
}

上記のように書くことで、Seederが増えてもDatabaseSeederの定数SEEDERSの中に追加するだけで、全てのSeederを一つのコマンドでまとめて実行することができます。

ダミーデータの日本語化

ダミーデータを日本語で生成するには、/config/app.phpのコードを下記のように変更します。

// 変更前
'faker_locale' => 'en_US',

// 変更後
'faker_locale' => 'ja_JP',

これでダミーデータを日本語で生成することができます。

Seederの実行

それでは実際にダミーデータを作成します。

下記のコマンドを実行します。

php artisan db:seed // DatabaseSeederに登録しているSeederをまとめて実行する場合
php artisan db:seed --class=UserSeeder // 特定のSeederだけ実行する場合

ダミーデータの確認

それではダミーデータが生成されているか確認してみましょう。

mysql> select * from users;
+----+------------------+-----+--------------------------------+--------+--------------------------------------------------------------+---------------------+--------------------------------------------------------------+----------------+---------------------+---------------------+
| id | name             | age | email                          | gender | introduction                                                 | email_verified_at   | password                                                     | remember_token | created_at          | updated_at          |
+----+------------------+-----+--------------------------------+--------+--------------------------------------------------------------+---------------------+--------------------------------------------------------------+----------------+---------------------+---------------------+
|  1 | 佐々木 陽一      |  71 | kudo.yasuhiro@example.org      |      1 | 高い高い三角標さんあるとそれに、にやに。                     | 2021-07-13 08:34:58 | $2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi | E0QvSI6VOS     | 2021-07-13 08:34:58 | 2021-07-13 08:34:58 |
|  2 | 中島 花子        |  51 | kyamada@example.net            |      1 | 前、一人ひとりは、思わず叫さけびました。                     | 2021-07-13 08:34:58 | $2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi | JOiw2towDw     | 2021-07-13 08:34:58 | 2021-07-13 08:34:58 |
|  3 | 田辺 舞          |  78 | yamaguchi.yasuhiro@example.org |      2 | 角標さんに植うえんして、星のように露つ。                     | 2021-07-13 08:34:58 | $2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi | ABGFqFuLy9     | 2021-07-13 08:34:58 | 2021-07-13 08:34:58 |
|  4 | 吉本 結衣        |  37 | haruka.yamaguchi@example.org   |      1 | 手りょうは、けれどもおまえは化学かがく。                     | 2021-07-13 08:34:58 | $2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi | CzO3m7v2pS     | 2021-07-13 08:34:58 | 2021-07-13 08:34:58 |
|  5 | 木村 亮介        |  37 | takahashi.youichi@example.com  |      2 | じらとも言いました。向むこうの三角標さ。                     | 2021-07-13 08:34:58 | $2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi | pnbEuhfTGf     | 2021-07-13 08:34:58 | 2021-07-13 08:34:58 |
|  6 | 鈴木 幹          |  24 | kondo.yasuhiro@example.com     |      2 | がいと思ったの」「いやぐらいなんです。。                     | 2021-07-13 08:34:58 | $2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi | YM0nRxm6PS     | 2021-07-13 08:34:58 | 2021-07-13 08:34:58 |
|  7 | 高橋 七夏        |  67 | idaka.kyosuke@example.org      |      1 | きりなけぁ」と言いえずさわやかぎを捕と。                     | 2021-07-13 08:34:58 | $2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi | aiQcVUhQxf     | 2021-07-13 08:34:58 | 2021-07-13 08:34:58 |
|  8 | 廣川 治          |  22 | nakajima.nanami@example.com    |      1 | たずねました。そしたしはずれにあってい。                     | 2021-07-13 08:34:58 | $2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi | mfO7t6Odq7     | 2021-07-13 08:34:58 | 2021-07-13 08:34:58 |
|  9 | 渚 香織          |  52 | mkijima@example.net            |      1 | を言いいまでもわたくさんか、そのとなり。                     | 2021-07-13 08:34:58 | $2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi | Xmww0bHMp1     | 2021-07-13 08:34:58 | 2021-07-13 08:34:58 |
| 10 | 斉藤 直樹        |  25 | hnishinosono@example.com       |      1 | っていまは列れつをはいけなんで光って、。                     | 2021-07-13 08:34:58 | $2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi | qoMa0DgytB     | 2021-07-13 08:34:58 | 2021-07-13 08:34:58 |
| 11 | 原田 浩          |  23 | atsushi83@example.net          |      1 | んなのです。私はこんだんだろう、虫だわ。                     | 2021-07-13 08:34:58 | $2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi | uATNlG9VkB     | 2021-07-13 08:34:58 | 2021-07-13 08:34:58 |
| 12 | 笹田 充          |  76 | kanou.yui@example.net          |      1 | 見たのほぼ中ごろぼくなって見ましたちの。                     | 2021-07-13 08:34:58 | $2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi | vVNa0YAMa2     | 2021-07-13 08:34:58 | 2021-07-13 08:34:58 |
| 13 | 喜嶋 くみ子      |  76 | taichi.watanabe@example.org    |      1 | べんきょうでした。「まあ、孔雀くじらな。                     | 2021-07-13 08:34:58 | $2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi | wr31KgRiAl     | 2021-07-13 08:34:58 | 2021-07-13 08:34:58 |
| 14 | 小泉 直樹        |  39 | rei.sasada@example.net         |      2 | フィックふうです。たしの先生がまるなの。                     | 2021-07-13 08:34:58 | $2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi | lfgGc0q7pP     | 2021-07-13 08:34:58 | 2021-07-13 08:34:58 |
| 15 | 笹田 知実        |  71 | tomoya.aota@example.com        |      2 | 中の三角標さんの足おとしてそこに、尋た。                     | 2021-07-13 08:34:58 | $2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi | FdnlkJ8l6c     | 2021-07-13 08:34:58 | 2021-07-13 08:34:58 |
| 16 | 中津川 七夏      |  65 | shota44@example.org            |      2 | える橋はしらのなかを汽車のすぐ飛とび出。                     | 2021-07-13 08:34:58 | $2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi | ywhxH1HcPc     | 2021-07-13 08:34:58 | 2021-07-13 08:34:58 |
| 17 | 近藤 聡太郎      |  34 | yuta.tanabe@example.net        |      1 | うつくしいかにそれをおつかれてつ器きの。                     | 2021-07-13 08:34:58 | $2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi | DXvo3prche     | 2021-07-13 08:34:58 | 2021-07-13 08:34:58 |
| 18 | 松本 零          |  61 | soutaro.fujimoto@example.org   |      2 | 原のはこんどんどいちばんは、とうを着き。                     | 2021-07-13 08:34:58 | $2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi | Ch0XKMoEbD     | 2021-07-13 08:34:58 | 2021-07-13 08:34:58 |
| 19 | 大垣 康弘        |  23 | vtakahashi@example.com         |      1 | ずがかってそこでです。けれど兵隊へいた。                     | 2021-07-13 08:34:58 | $2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi | sMgmihi2Sx     | 2021-07-13 08:34:58 | 2021-07-13 08:34:58 |
| 20 | 山本 浩          |  49 | gmatsumoto@example.net         |      2 | 雀くじゃまなように窓まどからから、燈台。                     | 2021-07-13 08:34:58 | $2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi | NtdztErPGY     | 2021-07-13 08:34:58 | 2021-07-13 08:34:58 |
+----+------------------+-----+--------------------------------+--------+--------------------------------------------------------------+---------------------+--------------------------------------------------------------+----------------+---------------------+---------------------+
20 rows in set (0.00 sec)

少し見づらくなってしまっていますが、ダミーデータができていますね。

このようにすることでダミーデータを簡単に、大量に作成できます。

ダミーデータは動作確認をする際や、ポートフォリオを提出する際に必ず必要となりますので、ぜひこの機会にやったことのない方は、ぜひ手を動かして試して見てください。

さいごに

いかがでしたでしょうか?

ダミーデータの作成方法について理解できましたでしょうか?

ご質問やご指摘等ある方はコメントしていただければ返信させていただきます。

これからもエンジニアの方、プログラミング初学者の方に役に立つ記事を更新していきますのでよろしくお願いします!

Twitterでも情報発信をしていますので、よかったらフォローをお願いします(^^)

Webエンジニア
タクマ
埼玉県出身の33歳

新卒で入社した専門商社で8年間営業職として勤務

30歳からプログラミングを始め31歳でWebエンジニアに転職成功

受託開発企業での開発を1年弱経験したのち、現在はスタートアップの自社開発企業で開発に従事している
\ Follow me /

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA