在laravel中,chunk()方法用於將集合分割為多個指定大小的較小集合,語法為「$指定集合->chunk(指定數量);」;該方法會對個別用戶數據更新後再查看個別用戶數據,這樣在查詢數據時沒有取得大量數據,能夠減輕系統的壓力。
本文操作環境:Windows10系統、Laravel6版、Dell G3電腦。
chunk()
chunk 方法將集合分割為多個給定大小的較小集合。將集合顯示到網格中非常有用。
$prices = collect([18, 23, 65, 36, 97, 43, 81]); $prices = $prices->chunk(3); $prices->toArray();
以上程式碼產生效果。
[ 0 => [ 0 => 18, 1 => 23, 2 => 65 ], 1 => [ 3 => 36, 4 => 97, 5 => 43 ], 2 => [ 6 => 81 ] ]
常規使用
如果有這樣的需求:對資料庫的整個資料查詢出來,進行一系列更新
簡單粗暴的方法是把查詢到的全部數據,使用foreach進行操作,然後再存入資料庫。
$users = User::all(); foreach ($users as $user) { $some_value = ($user->some_field > 0) ? 1 : 0; $user->update(['some_other_field' => $some_value]); }
如果資料非常寵大,系統可能會耗盡內存,這個方法顯然很笨拙。
Laravel 為此提供了一個簡潔的解決方案
Laravel 的chunk 方法可以將集合拆成多個指定大小的小集合
User::chunk(100, function ($users) { foreach ($users as $user) { $some_value = ($user->some_field > 0) ? 1 : 0; $user->update(['some_other_field' => $some_value]); } });
以上程式碼運行的原理是:
運行一個chunk ,這個chunk 查出100個用戶數據,對各個用戶數據進行更新
然後再查看100個用戶數據,再執行更新操作,依此類推。
這意味著在查詢數據時不會從資料庫中獲取大量數據,每次查詢100條數據,而不是整個表。
這樣就減輕的系統的壓力。
2.需要注意的地方
本文重點來了:
但是要小心,有過濾結果的不能像這樣運行
User::where('approved', 0)->chunk(100, function ($users) { foreach ($users as $user) { $user->update(['approved' => 1]); } });
從程式碼執行上講,這個語句並不會引發任何錯誤
但是這裡的問題是,您要過濾approved=0的用戶,執行approved=1的資料庫操作
然後chunk下一個100條數據,此時數據已經更改,您將錯過一頁數據。
這意味著您將只處理一半的條目,還有一半漏掉了。
解決方案:
在Laravel 5.2 之後可以使用chunkById 方法
在Laravel 5.2 之前可以參考以下程式碼
while(User::where('approved', 0)->count() > 0) { User::where('approved', 0)->chunk(100, function ($users) { foreach ($users as $user) { $user->update(['approved' => 1]); } }); }
【相關推薦:laravel影片教學】
以上是laravel的chunk方法怎麼用的詳細內容。更多資訊請關注PHP中文網其他相關文章!