如何在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
相关产品推荐
相关产品推荐

