为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕标琳琳 2022-09-25 20:54:44
当我试图用几个连接和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字节)...如果您有办法解决此类问题,请分享。谢谢!
查看完整描述

3 回答

?
长风秋雁

TA贡献1757条经验 获得超7个赞

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


查看完整回答
反对 回复 2022-09-25
?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

您可以增加内存限制 php.ini

ini_set('memory_limit','160M'); or memory_limit = 2024M


查看完整回答
反对 回复 2022-09-25
?
茅侃侃

TA贡献1842条经验 获得超22个赞

我发现问题在于 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。但事实上,在我看来,这并不是你可能预料到的正常的拉拉维尔行为。


查看完整回答
反对 回复 2022-09-25
  • 3 回答
  • 0 关注
  • 121 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号