Как создать красноречивый запрос для Group by с помощью HAVING и MAX

#laravel #laravel-5 #eloquent

#laravel #laravel-5 #красноречивый

Вопрос:

У меня есть SQL-запрос, который мне нужно преобразовать в Eloquent, и я понятия не имею, где написать МАКСИМАЛЬНЫЕ условия. Как возможно преобразовать его без большого количества необработанного sql? Спасибо!

 SELECT bike_id
FROM bike_filters
GROUP BY bike_id
HAVING
   MAX(bike_category_id in (416,11111)) = 1
   AND MAX(bike_category_id in (5555,779)) = 1
   AND MAX(bike_category_id in (5555,772)) = 1
  

Структура таблицы:

 | id | bike_id | bike_category_id |
| 1  | 3       | 416              |
| 2  | 3       | 779              |
| 3  | 3       | 344              |
| 4  | 3       | 332              |
| 5  | 4       | 444              |
| 5  | 5       | 555              |
  

Цель этого запроса — получить bike_id s, у которого есть все параметры по запросу — у bike может быть 20 фильтров, но если пользователь выполняет поиск по 5 и bike им соответствует, мы получаем bike_id по этому запросу.

Ответ №1:

Для этого вы могли бы использовать havingRaw(), который выглядел бы примерно так:

 $query = DB::table('bike_filters')
    ->select('bike_id')
    ->groupBy('bike_id')
    ->havingRaw('MAX(bike_category_id in (416,11111)) = 1')
    ->havingRaw('MAX(bike_category_id in (5555,779)) = 1')
    ->havingRaw('MAX(bike_category_id in (5555,772)) = 1')
    ->get();