CakePHP 3.x 如何统计指定日期范围内每个用户的总登录次数
实现方案
核心改造点
- 替换原
distinct去重逻辑为GROUP BY user_id分组统计,实现每个用户登录次数的计算 - 增加请求参数读取和校验逻辑,动态拼接日期查询条件
- 修正结束日期的时间边界,避免漏统计结束日期当天的登录数据
完整代码
public function index() { $this->paginate = [ 'contain' => 'Users', ]; // 读取GET请求中的日期参数 $startDate = $this->request->getQuery('start_date'); $endDate = $this->request->getQuery('end_date'); $query = $this->Logins->find('all') ->select([ 'Logins.user_id', // 统计每个用户的登录次数,别名为login_count 'login_count' => $this->Logins->func()->count('Logins.id') ]) // 按用户ID分组,保证每个用户只返回一条记录 ->group('Logins.user_id'); // 校验并追加起始日期条件 if ($startDate && strtotime($startDate)) { $query->where(['Logins.date >=' => date('Y-m-d 00:00:00', strtotime($startDate))]); } // 校验并追加结束日期条件 if ($endDate && strtotime($endDate)) { $query->where(['Logins.date <=' => date('Y-m-d 23:59:59', strtotime($endDate))]); } $this->set('logins', $this->paginate($query)); }
使用说明
- 前端请求时在查询参数中带入
start_date和end_date即可,支持Y-m-d等常用日期格式 - 统计得到的login_count字段会随用户信息一起返回,直接在视图层调用即可
提示:如果需要返回更多Users表的字段,可以在
select中追加对应字段,也可以在contain配置中指定需要的关联字段,CakePHP会自动处理关联数据的映射。
内容的提问来源于stack exchange,提问作者Newbie_IT
相关产品推荐
相关产品推荐

