如何使用Carbon与Laravel正确检测预约时间是否存在冲突
预约系统重叠预约问题与解决方法
我正在开发一个预约系统,目前已有一个12:00-13:00的1小时预约。当前逻辑能阻止新预约在该时段内开始,但存在漏洞:如果用户创建11:30开始、时长2小时(13:30结束)的预约,这个预约会和已有12:00-13:00的预约重叠,却能成功创建,这不符合需求。
当前代码实现
$intervals = CarbonInterval::minutes('15')->toPeriod($start, $end); foreach ($intervals as $time) { $this_time = Carbon::parse($time)->tz('Europe/Stockholm'); $current_mission_end_from_time = Carbon::parse(roundToNearestMinuteInterval($this_time->addMinutes($current_mission_length))); if ($busy_between->isNotEmpty()) { foreach ($busy_between as $busy) { if ($time->between($busy['start'], $busy['end'])) { $busy_times->add($time->format('H:i')); } } } }
空闲时间筛选逻辑
foreach ($intervals as $time) { if (!$busy_times->contains($time->format('H:i'))) { $free_times->add($time->format('H:i')); } }
更新后的解决方案代码
if ($busy_between->isNotEmpty()) { foreach ($busy_between as $busy) { if ($time->between($busy['start'], $busy['end'])) { $busy_times->add($time->format('H:i')); } $exitingAppointment = CarbonPeriod::create($busy['start'], $busy['end']); $appointmentTentative = CarbonPeriod::create($time, $current_mission_end_from_time); if ($exitingAppointment->overlaps($appointmentTentative)) { $busy_times->add($time->format('H:i')); } } }
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

