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

