如何让Laravel的Booking Model获取唯一可重复的上一条预订ID
解决Laravel Booking Model获取上一条预订ID的重复问题
问题根源在于仅用start_datetime排序时,相同时间的记录缺乏明确的顺序规则,导致重复返回同一ID。要实现唯一、可重复的排序逻辑,需要结合**唯一标识字段(如id)**补充排序条件,确保每个预订记录的位置是确定的。
修改后的previousBookingID方法如下:
public function previousBookingID() { $previousBooking = Booking::where('room_id', $this->room_id) ->where(function ($query) { $query->where('start_datetime', '<', $this->start_datetime) ->orWhere(function ($query) { $query->where('start_datetime', '=', $this->start_datetime) ->where('id', '<', $this->id); }); }) ->orderBy('start_datetime', 'desc') ->orderBy('id', 'desc') ->select('id') ->first(); return $previousBooking ? $previousBooking->id : null; }
关键改动说明:
- 精准筛选条件:将原有的
start_datetime <=拆分为两个逻辑分支,确保同时间的记录也能被正确区分:- 匹配开始时间早于当前预订的记录;
- 匹配开始时间等于当前预订,但
id更小的记录(利用id自增唯一的特性,区分同时间的不同预订)。
- 稳定排序规则:先按
start_datetime降序,再按id降序,让同时间的记录也能按唯一标识确定顺序,保证每次查询结果的一致性。
调整后,无论是否存在相同start_datetime的预订,每个记录都能找到唯一对应的上一条预订ID,不会出现循环返回的问题。
内容的提问来源于stack exchange,提问作者ToniLu
相关产品推荐
相关产品推荐

