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テーブルのデータ生成日時をランダムにカラムへ挿入してみます。
コードの修正結果の例はこちら。
<?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【初心者向け】