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

如何在Laravel Eloquent中按日期分组统计去重后的用户访问数

解决方案:Laravel Eloquent实现按日期统计独立用户访问量

这个需求核心就是按日期分组,统计每天的独立用户数——同一用户在同一天的多次访问只算一次,最终累加当天的不同用户数量。下面给你两种实用的实现方式:

方式一:直接用SQL聚合函数(高效简洁)

这是最推荐的写法,直接在数据库层面完成分组和去重统计,性能最优:

$dailyUniqueUsers = AccessLog::select(
    DB::raw('DATE(date_access) as access_date'),
    DB::raw('COUNT(DISTINCT user_id) as unique_users')
)
->groupBy('access_date')
->orderBy('access_date', 'desc') // 可选:按日期倒序排列
->get();

关键细节解释:

  • DATE(date_access):把你的date_access字段(假设是datetime/timestamp类型)转换为纯日期格式,确保同一天的所有记录会被归为一组
  • COUNT(DISTINCT user_id):对每个日期分组内的user_id去重后计数,完美匹配你“同一user_id合并为1条,累加不同user_id数量”的需求
  • 如果你的date_access是字符串格式(比如'2018-03-07 14:30:00'),这个转换依然有效;如果是非常规格式,可能需要用STR_TO_DATE()之类的函数调整

方式二:先获取去重记录再统计(适合需后续处理场景)

如果你需要先拿到每个用户每天的唯一记录集合,再做其他业务处理,可以先按日期+用户分组,再用Collection方法统计:

// 先获取去重后的用户-日期记录
$uniqueAccessRecords = AccessLog::select('user_id', DB::raw('DATE(date_access) as access_date'))
->groupBy('access_date', 'user_id')
->get();

// 再按日期分组统计数量
$dailyCount = $uniqueAccessRecords->groupBy('access_date')->map(function ($group) {
    return $group->count();
});

这种方式的好处是,$uniqueAccessRecords里保留了每个用户每天的访问记录,方便后续扩展(比如查看某天具体有哪些用户访问)。

结果转换(可选)

如果需要把结果转换成日期 => 数量的键值对数组,直接用Collection的pluck方法:

$dateCountArray = $dailyUniqueUsers->pluck('unique_users', 'access_date')->toArray();
// 输出示例:["2018-03-07" => 2, "2018-03-08" => 5]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:34:33