LaravelのFakerを使ってDBにランダムな日付のダミーデータを挿入する


seederを使ってデータベースにテスト用のデータを挿入する際、デフォルトのままだとcreated_atやupdated_atなどの日時がマイグレーション実行時の日時で一括登録されてしまうと思います。使用するのがCarbon::now()であれば現在日時を取得するメソッドとなるためです。
ただテストデータとしては過去の日時で何パターンかランダムに登録して、DBから抽出する際にselectとかorder byとかasc/descとかで日付順に並べたいときってありますよね。
そういうとき、ダミーのデータを自動で生成できる Faker というPHPのライブラリが元々 Laravel に入っているので、便利だなと思い備忘録として書いておきます。

Fakerでテスト用のデータを自動生成する

前述のように、FakerというライブラリはLaravelに最初から入っているので、Laravelで開発をしている場合はあらためてのインストールが不要です。

使用可能なプロパティ、データ型、実例などは、少し前の記事ですがこちらの方のチートシートがよくまとまっていました。
[Laravel5.1]Fakerチートシート

こちらを参考に、日付時刻を直近10年以内のものでランダムに生成したいなとなった場合は、dateTimeThisDecadeのメソッドが使えそうです。データ型はDateTime型でした。

ただ'created_at' => dateTimeThisDecade(),のようにするだけではエラーになって使えないので、どのクラスをuseするかきちんと書いてあげる必要があります。

Fakerの日時関連の処理はどこにあるのかなと探してみたら、このサイトが詳しく書いてあったので参考にしました。
Generate API documentation alpha | Faker, Class DateTime

仮にusersテーブルのデータ生成日時をランダムにカラムへ挿入してみます。
コードの修正結果の例はこちら。

database/seeds/UsersTableSeeder.php
<?php

use Illuminate\Database\Seeder;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Faker\Provider\DateTime; // 追加

class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $users = [
            [
                'id' => '1',
                'name'  => 'Sasaki Daisuke',
                'email'  => '[email protected]',
            ],
            [
                'id' => '2',
                'name'  => 'Takahashi Hanako',
                'email'  => '[email protected]',
            ],
            [
                'id' => '3',
                'name'  => 'Suzuki Ichiro',
                'email'  => '[email protected]',
            ],
        ];

        foreach ($users as $user) {
            DB::table('users')->insert([
                'id' => $user['id'],
                'name' => $user['name'],
                'email' => $user['email'],
                'created_at' => DateTime::dateTimeThisDecade(), // 追加
                'updated_at' => Carbon::now(),
            ]);
        }
    }
}

このようにseederを修正したら、テストデータ含めテーブルを再構成するのにphp artisan migrate:fresh --seedを実行。
これでうまくランダムな過去の日付と時間がusersテーブルのcreated_atカラムに挿入されました!

参考
[PHP] Fakerでランダムなフェイクデータを作成する
Factory, Fakerでテストデータ生成
Laravel5.7でSeedingを利用してダミーデータを挿入
【Laravel】ダミー(テスト)データを作る方法 シーダー(seeder)とfactoryとfaker【初心者向け】