Laravel 9 `groupBy` С учетом `limit` для каждой группы

Рейтинг: 0Ответов: 1Опубликовано: 06.03.2023

Столкнулся с такой проблемой.

По сути я хочу взать для каждогй группы определенное каличество строк.

К примеру для каждой группы по industry_id взять 2.

Вот пример для ՝count = 2՝

введите сюда описание изображения

Вот тот самый простой запрос на Laravel Eloquent

$response = $this->model->whereIn('industry_id', $industryIds)->get();
if($count > 0) {
    $response->groupBy('industry_id', function ($query) use($count) {
        return $query->limit($count);
    });
}
return $response->pluck('id')->toArray();

Но он не хочет работать как я ожидал.

Кто столкнулся с такой проблемой? И как решить эту проблему без Колхоза )))

Ответы

▲ 0Принят

Задача решается с помощью row_number().

С перва запрашиваем все результаты с row_number().

$response = $this->model->select('*', DB::raw('row_number() over (partition by industry_id) AS rowCnt'))->whereIn('industry_id', $industryIds)->get();

введите сюда описание изображения

Поскольку laravel может работать с коллекциями и после ->get().

Можем сделать так.

$response->where('rowCnt', '<', $count+1);

Потому что уже в коллекции есть колонка с номерами с именем rowCnt.

Дальше уже мы получаем результаты с лимитом по каждой группе.

введите сюда описание изображения

Вот и весь простенький код )))

$response = $this->model->select('*', DB::raw('row_number() over (partition by industry_id) AS rowCnt'))->whereIn('industry_id', $industryIds)->get();
if($count > 0) {
    $response->where('rowCnt', '<', $count+1);
}
return $response->toArray();

И особая благодарность пользователю @teran за подсказку по какому направлению искать.