LoginSignup
7
5

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-09-05

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'  => 'sasaki@example.com',
            ],
            [
                'id' => '2',
                'name'  => 'Takahashi Hanako',
                'email'  => 'takahashi@example.com',
            ],
            [
                'id' => '3',
                'name'  => 'Suzuki Ichiro',
                'email'  => 'suzuki@example.com',
            ],
        ];

        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【初心者向け】

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5