Intereting Posts
Postgresql: как эффективно заполнять таблицу с 10 миллионами строк со случайной строкой Ошибка вставки Oracle: недействительный месяц Поместите pg_try_advisory_xact_lock () во вложенный подзапрос? как получить ближайшее значение из базы данных в mysql Оператор INSERT SELECT в Oracle 11G Могу ли я сохранить результат запроса sql в свойстве непосредственно в ant Выберите только столбцы с нулевыми / пустыми значениями из таблицы Pandon Pandas – использование to_sql для записи больших кадров данных в кусках Как вернуть только 1 строку, если несколько повторяющихся строк и по-прежнему возвращать строки, которые не дублируются? Синтаксическая ошибка при выполнении инструкции INSERT INTO Пользовательский тип почтового типа в год / месяц Почему Select Count (*) медленнее, чем Select * в улье Сообщение об исключении критического сообщения HSQLDB: «функция не поддерживается» В чем разница между UNION и UNION ALL? Java Iterator, поддерживаемый ResultSet

Красноречивые проблемы с Raw

У меня есть две таблицы SQL: одна, представляющая туры, а другая, которая представляет заказы для этих туров. Структура выглядит следующим образом:

tours (int) id (int) max_participants (int) state bookings (int) id (fk) tour (fk) date (int) num_passengers 

В таблице заказов есть дата FK, но эта таблица очень проста и не важна, так как это не дает мне никаких проблем.

Теперь мне нужно отфильтровать мои туры и показать клиенту только ту поездки, которые могут по-прежнему разместить его нужное количество пассажиров. Таким образом, если в туре есть max_participants из 50, и на определенную дату в нескольких заказах уже есть 48 num_passengers, я должен отказаться от дополнительного бронирования 3-х пассажиров (как 48 + 3> = 50), но принять дополнительный заказ на 2 пассажира (как 48 + 2> = 50).

Я вышел с этим SQL, и он отлично работает (некоторые значения жестко запрограммированы для чтения, но они работают с переменными):

 select * from `tours` where `state` = 1 and exists (select * from `bookings` where `bookings`.`tour` = `tours`.`id` and `date` = 280 having SUM(num_passengers) + 2 <= `tours`.`max_participants`) 

Когда я пытаюсь сделать это красноречивым, я добрался так далеко:

 $tours = Tour::where('state', 1) ->whereHas('toursBookings', function ($query) use ($request, $date) { return $query->where('date', $date->id) ->havingRaw('SUM(num_passengers) + ' . $request->get('filter_number_passengers') . ' <= ?', [50]); }) ->get(); 

Работы похожи на обаяние и делают все, что он должен делать, НО число 50 жестко запрограммировано! Это серьезная проблема, так как каждый тур имеет разное количество max_participants.

Может ли кто-нибудь выяснить способ решения этого и не-hardcode, что 50? Это должны быть tours . max_participants как в SQL.

Если я правильно понял, вы можете сделать что-то вроде этого

 $max_participants = [50]; $tours = Tour::where('state', 1) ->whereHas('toursBookings', function ($query) use ($request, $date,$max_participants) { return $query->where('date', $date->id) ->havingRaw('SUM(num_passengers) + ' . $request->get('filter_number_passengers') . ' <= tours.max_participants'); }) ->get();