laravel的chunk方法怎么用

laravel中,chunk()方法用于將集合分割為多個指定大小的較小集合,語法為“$指定集合->chunk(指定數量);”;該方法會對各個用戶數據進行更新后再查看各個用戶數據,這樣在查詢數據時沒有獲取大量數據,能夠減輕系統的壓力。

laravel的chunk方法怎么用

本文操作環境:Windows10系統、Laravel6版、Dell G3電腦。

laravel的chunk方法怎么用

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視頻教程

以上就是

? 版權聲明
THE END
喜歡就支持一下吧
點贊13 分享