Я обнаружил, что проблема была в том, что laravel получало общее количество записей для результатов разбивки на страницы:
public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null)
{
...
$total = $this->toBase()->getCountForPagination()
...
}
protected function runPaginationCountQuery($columns = ['*'])
{
return $this->cloneWithout($without)->cloneWithoutBindings($this->unions ? ['order'] : ['select', 'order'])->setAggregate('count', $this->withoutSelectAliases($columns))->get()->all();
}
В общем случае последний метод runPaginationCountQuery для получения количества записей создает необработанный запрос к БД, такой как:
выбор количества (*) в качестве совокупности из lots
левого соединения tenders
в tenders
. id
= lots
. tender_id
левого соединения customers
на lots
. customer_id
.....
Но с groupBy в запросе вместо одна строка с общим количеством я получил 420650 строк по одному в ряду! Это был достаточно большой массив, который был создан только для подсчета количества строк, и в моем случае это была причина законченной памяти.
Я понимаю, что groupBy для больших данных не является хорошим решением, и я сделал рефакторинг мой код, чтобы отменить groupBy из моего запроса. Но на самом деле мне кажется, что это не было нормальное поведение laravel, которое вы, вероятно, ожидали.