Mysql Laravel对预订的雄辩查询

Mysql Laravel对预订的雄辩查询,mysql,laravel,eloquent,Mysql,Laravel,Eloquent,我正在使用Laravel为一家酒店创建一个预订应用程序 使用的数据库是MySQL。有一张有所有房间的桌子和一张有预定房间的桌子。ReservedRoom具有房间的外键(房间id) 要在特定时间间隔内获得可用房间,我使用2个查询: 首先我得到所有没有预订的房间 $room = App\Room::whereNotIn('id',App\ReservedRoom::select('camera_id'))->get(); 然后,如果reservedroom的签入/签出日期低于我的签入日期或

我正在使用Laravel为一家酒店创建一个预订应用程序

使用的数据库是MySQL。有一张有所有房间的桌子和一张有预定房间的桌子。ReservedRoom具有房间的外键(房间id)

要在特定时间间隔内获得可用房间,我使用2个查询:

  • 首先我得到所有没有预订的房间

    $room = App\Room::whereNotIn('id',App\ReservedRoom::select('camera_id'))->get();
    
  • 然后,如果reservedroom的签入/签出日期低于我的签入日期或高于我的签出日期,我将签入reservedroom表

    $room2 = App\ReservedRoom::select('camera_id')->where([['checkin','<','mycheckin'],['checkout','<','mycheckin']])->orWhere([['checkin','>','mycheckout'],['checkout','>','mycheckout']]); 
    

    问题是,当一个房间被预订两次时,如果其中一个日期可用,而另一个日期不可用,那么其中一个日期将通过条件,房间将显示在结果中。

    我会尝试在单个查询中获得结果(根据Laravel docs):

    $room=App\room::
    whereNotIn('id',App\ReservedRoom::select('camera\u id'))
    ->其中(函数($query){
    $query->where(['checkin','','mycheckout'],
    ['checkout'、'>'、'mycheckout']]
    }))->get();
    

    我希望它能有所帮助。

    我认为
    $rr
    $room2
    是一样的?是的,当我让它更具可读性时,我忘了更改它。我的错。嗨,谢谢你的回答。然而,这并不能真正解决文章中描述的问题。我需要一种方法来避免一个房间在之前被检查为不可用后被视为可用。谢谢你的评论。我首先想到的是范围是问题所在,可能第二个查询中的:(checkin>mycheckout)和(checkout$result=$room->merge($room2);
    $room = App\Room::
        whereNotIn('id',App\ReservedRoom::select('camera_id')
        ->where(function ($query) {
            $query->where([['checkin','<','mycheckin'],
                'checkout','<','mycheckin']])
                ->orWhere([['checkin','>','mycheckout'], 
                ['checkout','>','mycheckout']])
            }))->get();