Laravel 9 `groupBy` С учетом `limit` для каждой группы
Столкнулся с такой проблемой.
По сути я хочу взать для каждогй группы определенное каличество строк.
К примеру для каждой группы по 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();
Но он не хочет работать как я ожидал.
Кто столкнулся с такой проблемой? И как решить эту проблему без Колхоза )))
Ответы (1 шт):
Задача решается с помощью 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 за подсказку по какому направлению искать.


