戏里戏外

Laravel Factory 批量填充数据时递增日期

2024-11-04#Laravel

通常会使用下面的方式使用 Factory 来填充数据:

public function run(): void
{
    Message::factory()
        ->count(5000)
        ->create();
}

这种方式的问题是所有记录的 created_at 时间都是相同的,这在使用 orderBylatest 排序时无法体现真实的数据顺序。

基础用法

public function run(): void
{
    Message::factory()
        ->count(5000)
        ->sequence(fn (Sequence $sequence) => [
            'created_at' => now()->subHour($sequence->index)
        ])
        ->create();
}

更多用法

使用 sequence 批量填充数据时配合 CarbonsubDays()SubMinutes()subHours()subYears()subWeeks()等方法。

public function run(): void
{
    Message::factory()
        ->count(5000)
        ->sequence(fn (Sequence $sequence) => [
            'created_at' => now()->subDays($sequence->index),
//          'created_at' => now()->subMinutes($sequence->index * 5), # 按分钟
//            'created_at' => now()->subHours($sequence->index * rand(1, 10), # 随机时间
        ])
        ->create();
}

博客文章数据填充

public function run(): void
{
    Post::factory()
        ->count(100)
        ->sequence(fn (Sequence $sequence) => [
            'created_at' => now()->subDays($sequence->index),
            'published_at' => now()->subDays($sequence->index)->addHours(2)
        ])
        ->create();
}

用户活动记录

public function run(): void
{
    Activity::factory()
        ->count(1000)
        ->sequence(fn (Sequence $sequence) => [
            'created_at' => now()->subMinutes($sequence->index * 15),
            'user_id' => ($sequence->index % 10) + 1  // 循环前 10 个用户
        ])
        ->create();
}

注意事项

  • sequence 中的 index 从 0 开始计数
  • 可以在 sequence 中修改任何字段,不仅限于 created_at
  • 建议根据实际业务场景选择合适的时间间隔
  • 大量数据填充时要注意性能影响

通过使用 sequence 功能,我们可以创建更真实的测试数据,使得数据排序更有意义,更接近实际应用场景。