Php Laravel 5查询生成器逻辑不正确
我需要将此MYSQL查询移植到Laravel 5.2查询生成器,我不知道如何成功实现逻辑非部分:Php Laravel 5查询生成器逻辑不正确,php,laravel,laravel-5.2,laravel-query-builder,Php,Laravel,Laravel 5.2,Laravel Query Builder,我需要将此MYSQL查询移植到Laravel 5.2查询生成器,我不知道如何成功实现逻辑非部分: SET @in='2017-06-01', @out='2017-06-01'; SELECT rooms.id, rooms.name, reservations.check_in, reservations.check_out, reservations.room_id FROM rooms LEFT JOIN reservations ON rooms
SET @in='2017-06-01', @out='2017-06-01';
SELECT
rooms.id,
rooms.name,
reservations.check_in,
reservations.check_out,
reservations.room_id
FROM
rooms
LEFT JOIN
reservations
ON rooms.id = reservations.room_id AND
NOT (
(reservations.check_in < @in AND reservations.check_out < @in)
OR
(reservations.check_in > @out AND reservations.check_out > @out)
)
WHERE reservations.room_id IS NULL
SET@in='2017-06-01',@out='2017-06-01';
挑选
房间号,
房间名称,
预订,登记,
预订,退房,
预订。房间号
从…起
房间
左连接
保留地
ON rooms.id=reservations.rooms\u id和
不是(
(预订.签入<@in和预订.签出<@in)
或
(保留。签入>@签出和保留。签出>@签出)
)
其中reservations.room\u id为空
我试图使用查询生成器的原始查询但它不起作用,我得到一个调用undefined方法illumb\Database\Query\Expression::whereNull()错误
$free_rooms = Room
::select('rooms.id', 'rooms.name')
->leftJoin('reservations', 'rooms.id', '=', 'reservations.room_id') AND
DB::raw("
NOT (
(reservations.check_in < $request->check_in AND reservations.check_out < $request->check_in)
OR
(reservations.check_in > $request->check_out AND reservations.check_out > $request->check_out)
)
")
->whereNull('reservations.room_id')
->get();
$free\u rooms=房间
::选择('rooms.id'、'rooms.name')
->leftJoin('reservations','rooms.id','=','reservations.rooms_id')和
数据库::原始(“
不是(
(预订。签入<$request->签入和预订。签出<$request->签入)
或
(预订。签入>$request->签出和预订。签出>$request->签出)
)
")
->whereNull('reservations.room\u id')
->get();
首先:
->leftJoin('reservations', 'rooms.id', '=', 'reservations.room_id') AND
和
被解析为PHP操作符,而不是SQL
及
链接到DB::raw(…)的结果上,并导致异常
Second:您的加入条件可以简化为
ON rooms.id = reservations.room_id
AND reservations.check_out >= @in
AND reservations.check_in <= @out
注意,我刚刚简化了你的条件,保留了逻辑。但通常情况下,一位客户可以在另一位客户退房的同一天(下午)办理入住手续(上午)。所以情况应该是这样的
AND reservations.check_out > :check_in
AND reservations.check_in < :check_out
和预订。签出>:签入
和预订。签入<:签出
首先:
->leftJoin('reservations', 'rooms.id', '=', 'reservations.room_id') AND
和
被解析为PHP操作符,而不是SQL
及
链接到DB::raw(…)的结果上,并导致异常
Second:您的加入条件可以简化为
ON rooms.id = reservations.room_id
AND reservations.check_out >= @in
AND reservations.check_in <= @out
注意,我刚刚简化了你的条件,保留了逻辑。但通常情况下,一位客户可以在另一位客户退房的同一天(下午)办理入住手续(上午)。所以情况应该是这样的
AND reservations.check_out > :check_in
AND reservations.check_in < :check_out
和预订。签出>:签入
和预订。签入<:签出
如果您的查询对于查询生成器来说过于复杂,则始终可以使用<代码>房间::hydrateRaw($rawQuery,$bindings)我得到了一个SQLSTATE[HY093]:无效的参数编号错误,这里是我的代码外观的粘贴:如果您的查询对于查询生成器来说太复杂,您可以始终使用<代码>房间::hydrateRaw($rawQuery,$bindings)我得到了一个SQLSTATE[HY093]:无效的参数号错误,下面是我的代码外观的粘贴: