您好,登錄后才能下訂單哦!
這篇文章主要介紹“l(fā)aravel的chunk方法如何用”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“l(fā)aravel的chunk方法如何用”文章能幫助大家解決問(wèn)題。
在laravel中,chunk()方法用于將集合分割為多個(gè)指定大小的較小集合,語(yǔ)法為“$指定集合->chunk(指定數(shù)量);”;該方法會(huì)對(duì)各個(gè)用戶(hù)數(shù)據(jù)進(jìn)行更新后再查看各個(gè)用戶(hù)數(shù)據(jù),這樣在查詢(xún)數(shù)據(jù)時(shí)沒(méi)有獲取大量數(shù)據(jù),能夠減輕系統(tǒng)的壓力。
本文操作環(huán)境:Windows10系統(tǒng)、Laravel6版、Dell G3電腦。
chunk()
chunk 方法將集合分割為多個(gè)給定大小的較小集合。將集合顯示到網(wǎng)格中非常有用。
$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 ] ]
常規(guī)使用
如果有一個(gè)這樣的需求:對(duì)數(shù)據(jù)庫(kù)的全部數(shù)據(jù)查詢(xún)出來(lái),進(jìn)行一系列更新
簡(jiǎn)單粗暴的方法是 把查詢(xún)到的全部數(shù)據(jù),使用foreach進(jìn)行操作,然后再存入數(shù)據(jù)庫(kù)。
$users = User::all(); foreach ($users as $user) { $some_value = ($user->some_field > 0) ? 1 : 0; $user->update(['some_other_field' => $some_value]); }
如果數(shù)據(jù)非常寵大,系統(tǒng)可能會(huì)耗盡內(nèi)存,這個(gè)方法顯然很笨拙。
Laravel 為此提供了一個(gè)簡(jiǎn)潔的解決方案
Laravel 的 chunk 方法可以將集合拆成多個(gè)指定大小的小集合
User::chunk(100, function ($users) { foreach ($users as $user) { $some_value = ($user->some_field > 0) ? 1 : 0; $user->update(['some_other_field' => $some_value]); } });
以上代碼運(yùn)行的原理是:
運(yùn)行一個(gè) chunk ,這個(gè) chunk 查出100個(gè)用戶(hù)數(shù)據(jù),對(duì)各個(gè)用戶(hù)數(shù)據(jù)進(jìn)行更新
然后再查看100個(gè)用戶(hù)數(shù)據(jù),再執(zhí)行更新操作,依此類(lèi)推。
這意味著在查詢(xún)數(shù)據(jù)時(shí)不會(huì)從數(shù)據(jù)庫(kù)中獲取大量數(shù)據(jù),每次查詢(xún)100條數(shù)據(jù),而不是整個(gè)表。
這樣就減輕的系統(tǒng)的壓力。
2.需要注意的地方
本文重點(diǎn)來(lái)了:
但是要小心,有過(guò)濾結(jié)果的不能像這樣運(yùn)行
User::where('approved', 0)->chunk(100, function ($users) { foreach ($users as $user) { $user->update(['approved' => 1]); } });
從代碼執(zhí)行上講,這個(gè)語(yǔ)句并不會(huì)引發(fā)任何錯(cuò)誤
但是這里的問(wèn)題是,您要過(guò)濾approved=0的用戶(hù),執(zhí)行approved=1的數(shù)據(jù)庫(kù)操作
然后chunk下一個(gè)100條數(shù)據(jù),此時(shí)數(shù)據(jù)已經(jīng)更改,您將錯(cuò)過(guò)一頁(yè)數(shù)據(jù)。
這意味著您將只處理一半的條目,還有一半漏掉了。
解決方案:
在 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]); } }); }
關(guān)于“l(fā)aravel的chunk方法如何用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。