Как создать вложенный запрос с коллекцией Laravel - PullRequest
0 голосов
/ 03 ноября 2019

Я использую Laravel 6. У меня есть форма для создания встречи. Я хочу создать собственный валидатор, чтобы проверить, занята ли комната в это время. Параметры запроса: "room", "date_meeting", "start" и "end".

Другими словами, я хочу сделать следующий запрос MySQL с Laravel:

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 голосов
/ 03 ноября 2019

Поскольку ваш запрос 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...