Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel 5查询生成器逻辑不正确_Php_Laravel_Laravel 5.2_Laravel Query Builder - Fatal编程技术网

Php Laravel 5查询生成器逻辑不正确

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

我需要将此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.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]:无效的参数号错误,下面是我的代码外观的粘贴: