Как написать правильный запрос на сборку?Я застрял - PullRequest
0 голосов
/ 11 мая 2019

Так что мне нужен способ поиска в комнатах по некоторым критериям, это происходит из формы на домашней странице, где пользователь выполняет поиск по городу, room_type и check_in_date, check_out_date с datepicker Я хочу привести номера, которые находятся в rooms WHERE (input.check_in_date NOT BETWEEN (bookings.check_in_date AND bookings.check_out_date) AND input.check_in_date NOT BETWEEN (bookings.check_in_date AND bookings.check_out_date) OR NOT IN bookings) WHERE rooms.city = input.city AND rooms.room_type = input.room_type

Я пробовал много времени с запросами, но я застрял здесь, В данный момент мне намного проще работать с компоновщиком запросов laravel.

    $check_dates = explode(' - ', $request->datetimes);
    $check_in = date('Y-m-d', strtotime($check_dates[0]));
    $check_out = date('Y-m-d', strtotime($check_dates[1]));
    $room_types = RoomTypes::all();
    $rooms = DB::table('rooms')
        ->leftJoin('bookings', function ($join) use ($check_in, $check_out) {
            $join->on('rooms.id', '=', 'bookings.rooms_id')
                ->where(function ($q) use ($check_in, $check_out) {
                    $q->whereNotBetween('bookings.check_in_date', [$check_in, $check_out])
                        ->whereNotBetween('bookings.check_out_date', [$check_in, $check_out]);
                })->orWhere(function ($q) {
                    $q->whereNotIn('rooms.id', DB::table('bookings')->select('rooms_id'));
                });
        })
        ->where('rooms.city', $request->city)
        ->where('rooms.room_type', $request->room_type)
        ->get();

запрос такой

    SELECT * FROM `rooms` LEFT JOIN `bookings` ON `rooms`.`id` = `bookings`.`rooms_id`
 WHERE ((`bookings`.`check_in_date` NOT BETWEEN $check_in_date AND $check_out_date
 AND `bookings`.`check_out_date` NOT BETWEEN $check_in_date AND $check_out_date)
 OR `rooms`.`id` NOT IN (SELECT `rooms_id` FROM `bookings`)) AND `rooms`.`city` = $city AND `rooms`.`room_type` = $room_type

Ответы [ 2 ]

0 голосов
/ 12 мая 2019
$rooms = collect(DB::select("
SELECT * FROM `rooms` LEFT JOIN `bookings` ON `rooms`.`id` = `bookings`.`rooms_id`
WHERE `rooms`.`city` = '$request->city' AND `rooms`.`room_type` = '$request->room_type'
 AND ((`bookings`.`check_in_date` NOT BETWEEN '$check_in' AND '$check_out'
 AND `bookings`.`check_out_date` NOT BETWEEN '$check_in' AND '$check_out')
 OR `rooms`.`id` NOT IN (SELECT `rooms_id` FROM `bookings`))
"));

проблема решена с помощью этого способа, теперь возникает вопрос: можем ли мы сделать это с помощью построителя запросов или он слишком индивидуален для laravel для его построения

0 голосов
/ 11 мая 2019

Я бы использовал метод Eloquent whereHas .Это выглядело бы так:

$rooms = Room::doesntHave('bookings')->orWhereHas('bookings', function ($query) use ($check_in, $check_out) {
    $query->whereNotBetween('check_in_date', [$check_in, $check_out])
          ->whereNotBetween('check_out_date', [$check_in, $check_out]);
})
->where('city', $request->city)
->where('room_type', $request->room_type)
->get();

Этот код не проверен.Просто идея, как это должно быть проще решить;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...