Lumen中Eloquent查询俱乐部指定时段在场用户的问题
问题解决:获取时段内在场用户的正确Eloquent查询
当前查询的逻辑仅检查了预订的入场时间在目标时段内,或者离场时间在目标时段内,但忽略了预订完全覆盖目标时段的情况(比如10:00-13:00覆盖11:32-12:32)。这种情况下,入场时间早于目标时段开始,离场时间晚于目标时段结束,既不满足entry_time在目标区间,也不满足exit_time在目标区间,导致该记录被错误排除。
正确的时间重叠判断逻辑应为:预订的入场时间 ≤ 目标时段的结束时间,且预订的离场时间 ≥ 目标时段的开始时间。只要满足这两个条件,两个时段就存在重叠,用户属于在场状态。
修正后的查询代码如下:
$activity = Activity::findOrFail($activity_id); $users = User::whereHas('activities', function ($q) use ($activity) { $q->where('activities.activity_id', $activity->activity_id); })->whereHas('bookingActivities', function ($query) use ($booking) { $query->whereNull('cancelled_by') ->where(function ($q) use ($booking) { // 判断预订时段与目标时段是否重叠 $q->where('bookingActivities.entry_time', '<=', $booking->exit_time) ->where('bookingActivities.exit_time', '>=', $booking->entry_time); }); })->paginate();
注:原代码中存在笔误$booking->_entry_time,已修正为正确的$booking->entry_time。
内容的提问来源于stack exchange,提问作者joshi yogesh
相关产品推荐
相关产品推荐

