拉拉维尔分页“允许的记忆耗尽”

当我试图用几个连接和groupBy内部对大查询的结果进行分页时,我遇到了问题。我的部分代码在这里:


$lots = Lot::select('lots.id', 'lots.name', 'lots.slug', 'lots.description', 'lots.customer as lot_customer',

            'lots.created_at', 'lots.measure', 'lots.delivery_place', 'lots.amount as real_amount', 'lots.amount')

            ->leftJoin('tenders', 'tenders.id', '=', 'lots.tender_id')

            ->leftJoin('customers', 'lots.customer_id', '=', 'customers.id')

            ->groupBy('lots.id')

            ->paginate(25);

我有420650 - 数据库中的总记录,但对于分页,我想每页只显示25条记录。我收到消息:


允许的内存大小已用尽(尝试分配16777224字节)...


如果您有办法解决此类问题,请分享。谢谢!


慕标琳琳
浏览 122回答 3
3回答

长风秋雁

此问题现在似乎已修复。我在拉拉维尔7.0中遇到了这个问题。更新到7.20,我不再耗尽内存,甚至下降到32M的内存限制。

凤凰求蛊

您可以增加内存限制 php.iniini_set('memory_limit','160M'); or memory_limit = 2024M

茅侃侃

我发现问题在于 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();}通常,最后一种方法运行分页CountRy为了获取记录计数而创建对数据库的原始查询,如下所示:选择 count(*) 作为从左联接开始的聚合。= .左联接上 ...lotstenderstendersidlotstender_idcustomerslotscustomer_id但是使用groupBy在查询中而不是一行,总计数我得到了420650行,每行一行!它是足够大的数组,创建只是为了获取行数,在我的情况下,这是完成内存的原因。我知道groupBy对于大数据不是一个好的决定,我对我的代码进行了重构,以从我的查询中撤消groupBy。但事实上,在我看来,这并不是你可能预料到的正常的拉拉维尔行为。
打开App,查看更多内容
随时随地看视频慕课网APP