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

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方法根据权限(是否管理员)和病区参数,动态添加筛选条件,保持代码灵活性

注意事项:

  1. 确认User模型中已正确定义punches关联(如public function punches() { return $this->hasMany(Punch::class); })
  2. whereBetween搭配Carbon实例的写法比转字符串更可靠,兼容更多数据库类型
  3. 若查询出现分组异常,可显式添加->groupBy('users.id')(Laravel通常会自动处理,但部分场景下需要手动指定)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 09:57:04