通常会使用下面的方式使用 Factory 来填充数据:
public function run(): void
{
Message::factory()
->count(5000)
->create();
}
这种方式的问题是所有记录的 created_at
时间都是相同的,这在使用 orderBy
或 latest
排序时无法体现真实的数据顺序。
基础用法
public function run(): void
{
Message::factory()
->count(5000)
->sequence(fn (Sequence $sequence) => [
'created_at' => now()->subHour($sequence->index)
])
->create();
}
更多用法
使用 sequence
批量填充数据时配合 Carbon
的 subDays()
、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
功能,我们可以创建更真实的测试数据,使得数据排序更有意义,更接近实际应用场景。