如何使用Laravel集合创建嵌套查询

时间:2019-11-03 01:13:10

标签: php laravel eloquent

我正在使用Laravel 6。 我有一个创建会议的表格。我想创建一个自定义验证器,以检查当时该房间是否已被占用。查询参数为“房间”,“约会”,“开始”和“结束”。

换句话说,我想用Laravel进行以下MySQL查询:

SELECT * 
FROM `meetings` 
WHERE id_room = 1 AND date = '2021-03-02' AND ((start_hour >= '22:00:00' AND start_hour < '23:00:00') OR (start_hour < '22:00:00' AND end_hour >= '23:00:00') OR (end_hour > '22:00:00' AND end_hour <= '23:00:00'))

我使用Laravel创建了以下查询,但无法正常工作:

public function passes($attribute, $value)
{
    $meetings = DB::table('meetings')
    ->where('id_room', request('room'))
    ->where('date', request('date_meeting'))
    ->where(function ($query) {
        $query->where('start_hour', '>=', request('start'))
        ->where('start_hour', '<', request('end'));
    })
    ->orWhere(function ($query) {
        $query->where('start_hour', '<', request('start'))
        ->where('end_hour', '>=', request('end'));
    })
    ->orWhere(function ($query) {
        $query->where('end_hour', '>', request('start'))
        ->where('end_hour', '<=', request('end'));
    })
    ->get();

    if(count($meetings) > 0) {
        return false;
    } else {
        return true;
    }
}

房间和日期在Laravel中可以正常使用...但是时间不能很好地使用。 你知道为什么它不能正常工作吗?

1 个答案:

答案 0 :(得分:0)

因为您的orWhere查询与where('id_room', request('room'))处于同一级别

您需要添加两级嵌套查询,如下所示:

$meetings = DB::table('meetings')
    ->where('id_room', request('room'))
    ->where('date', request('date_meeting'))
    ->where(function ($query) {
        $query->where(function($sub_q) {
                  $sub_q->where('start_hour', '>=', request('start'))
                        ->where('start_hour', '<', request('end'));
              })
              ->orWhere(function($sub_q) {
                  $sub_q->where('start_hour', '<', request('start'))
                        ->where('end_hour', '>=', request('end'));
              })
              ->orWhere(function($sub_q) {
                   $sub_q->where('end_hour', '>', request('start'))
                         ->where('end_hour', '<=', request('end'));
              });
    })->get();