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

Eloquent计数查询:现有正确统计的查询代码相关技术问询

看起来你已经写了一段能正确统计时间区间重叠关联记录数的Eloquent代码,我帮你把这段代码整理规范,同时拆解下它的逻辑:

时间区间重叠关联计数的Eloquent实现

这段代码的核心是利用Eloquent的withCount方法,统计A模型关联的bs模型中,与指定时间区间[$from, $to]存在重叠的记录数量。

完整格式化后的代码

$query = A::withCount([
    'bs' => function ($query) use ($from, $to) {
        $query->where(function ($query) use ($from) {
                // 区间包含指定起始点 $from
                $query->whereDate('start', '<', $from)
                      ->whereDate('end', '>', $from);
            })
            ->orWhere(function ($query) use ($to) {
                // 区间包含指定结束点 $to
                $query->whereDate('start', '<', $to)
                      ->whereDate('end', '>', $to);
            })
            ->orWhere(function ($query) use ($from, $to) {
                // 记录的时间区间完全落在[$from, $to]内部
                $query->whereDate('start', '>', $from)
                      ->whereDate('end', '<', $to);
            });
    }
]);

逻辑拆解

这里的三个条件覆盖了时间区间重叠的全部场景:

  • 第一个闭包:目标记录的start早于$from且end晚于$from,意味着这条记录的区间包含了我们指定的起始点,必然和目标区间重叠。
  • 第二个闭包:目标记录的start早于$to且end晚于$to,对应包含指定结束点的重叠场景。
  • 第三个闭包:目标记录的start晚于$from且end早于$to,也就是这条记录的区间完全嵌套在我们指定的区间内,自然属于重叠情况。

执行这段查询后,每个A模型实例都会附带bs_count属性,直接拿到符合条件的关联记录总数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:15:36