亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

拉拉維爾分頁“允許的記憶耗盡”

拉拉維爾分頁“允許的記憶耗盡”

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 關注
  • 120 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號