Laravel Eloquent使用withCount()统计并筛选计数大于3的用户
筛选关联打卡记录数超3次的用户统计实现
针对统计本月内迟到打卡次数超过3次的用户需求,你的Eloquent查询结构基本可行,这里给出优化后的版本并说明关键细节:
$repeatedlyLatemark = User::withCount(['punches' => fn($q) => $q ->where('is_latemark', 1) ->whereBetween('punch_date', [ Carbon::today()->startOfMonth(), Carbon::today()->endOfMonth() ]) ]) ->having('punches_count', '>', 3) ->when(!$is_admin, fn($q) => $q->where('department_id', $authUser->department_id)) ->when($ward, fn($q) => $q->where('ward_id', $ward)) ->count();
关键说明:
withCount统计关联记录:通过闭包限定只统计is_latemark=1的迟到打卡,且时间范围为本月,自动生成punches_count字段having筛选聚合结果:直接用having过滤punches_count大于3的用户,注意这里用整数3而非字符串,避免不必要的类型转换问题- 简化日期查询:用
whereBetween替代两个whereDate,代码更简洁且逻辑清晰 - 条件筛选逻辑:
when方法根据权限(是否管理员)和病区参数,动态添加筛选条件,保持代码灵活性
注意事项:
- 确认User模型中已正确定义
punches关联(如public function punches() { return $this->hasMany(Punch::class); }) whereBetween搭配Carbon实例的写法比转字符串更可靠,兼容更多数据库类型- 若查询出现分组异常,可显式添加
->groupBy('users.id')(Laravel通常会自动处理,但部分场景下需要手动指定)
内容的提问来源于stack exchange,提问作者Core Ocean
相关产品推荐
相关产品推荐

