
本文介绍如何利用 Laravel 的 Eloquent ORM 和 Carbon 时间处理库,精准筛选出 created_at 早于当前日期三个月的所有用户记录,代码简洁高效,适用于日常数据清理、归档或统计场景。
本文介绍如何利用 laravel 的 eloquent orm 和 carbon 时间处理库,精准筛选出 `created_at` 早于当前日期三个月的所有用户记录,代码简洁高效,适用于日常数据清理、归档或统计场景。
在 Laravel 应用中,经常需要基于时间范围筛选模型数据。例如,获取所有注册时间超过三个月的用户(常用于清理沉寂账户、生成活跃度报告或触发自动化任务)。Eloquent 提供了链式查询能力,结合 Carbon(Laravel 默认集成的时间处理类)可轻松实现这一需求。
✅ 推荐写法(推荐使用 Carbon 实例直接比较,避免字符串格式化导致时区或精度问题):
use Carbon\Carbon;
use App\Models\User;
$threeMonthsAgo = Carbon::now()->subMonths(3);
$users = User::where('created_at', '<=', $threeMonthsAgo)->get();⚠️ 注意事项:
-
subMonths(3)按日历月递减(如 5 月 31 日 → 2 月 28/29 日),若需严格按 90 天计算,可改用subDays(90); - 数据库字段
created_at应为DATETIME或TIMESTAMP类型,且时区与应用配置一致(推荐统一使用 UTC 存储,应用层处理时区); - 若数据量较大,建议为
created_at字段添加数据库索引以提升查询性能:// 在迁移文件中添加 $table->index('created_at');
? 进阶提示:
你还可以将该逻辑封装为 Eloquent Scope,提升复用性:
// 在 User 模型中
public function scopeOlderThanThreeMonths($query)
{
return $query->where('created_at', '<=', Carbon::now()->subMonths(3));
}
// 使用方式
$users = User::olderThanThreeMonths()->get();综上,借助 Carbon 与 Eloquent 的原生时间比较能力,无需原始 SQL 即可安全、可读、可维护地完成时间范围查询。


















