You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel技术问询:筛选近30天标准账户ID及最优实现方式

最优方案:在数据库查询中直接添加时间过滤

毫无疑问,在数据库层面完成近30天的过滤是远优于获取结果后再处理的,主要原因有这几点:

  • 性能碾压:数据库会直接筛选出符合条件的记录,不需要把所有「标准账户」的数据都拉取到应用内存中再做二次过滤。当用户表数据量较大时,这能节省大量的内存占用和网络传输成本。
  • 代码更简洁易维护:过滤逻辑直接嵌入查询语句,后续看代码的人一眼就能明白你要获取的是「近30天的标准账户ID」,不用额外去看结果处理的逻辑。
  • 能利用索引优势:如果你的created_at字段创建了索引,数据库可以快速定位到近30天的数据,进一步提升查询效率——这是内存过滤完全做不到的。

修改后的Laravel查询代码如下:

$users = DB::table("users")
    ->select('id')
    ->where('accounttype', 'standard')
    ->where('created_at', '>=', now()->subDays(30))
    ->get()
    ->all();

这里用到的now()->subDays(30)是Laravel内置Carbon日期类的便捷方法,会自动生成当前时间往前推30天的DateTime对象,和你created_at字段的timestamp类型完美匹配,能准确筛选出近30天创建的用户。

如果非要在获取结果后处理(非常不推荐),代码大概是这样:

// 先获取所有标准账户(还得额外查created_at字段)
$allStandardUsers = DB::table("users")
    ->select('id', 'created_at')
    ->where('accounttype', 'standard')
    ->get()
    ->all();

// 再在内存中过滤近30天的用户
$filteredUsers = collect($allStandardUsers)->filter(function($user) {
    return $user->created_at >= now()->subDays(30);
})->pluck('id')->all();

但这种方式不仅多查了created_at字段,还要把所有标准账户加载到内存,数据量一大就会拖慢应用,完全没必要这么做。

内容的提问来源于stack exchange,提问作者user8012864

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:27:20