溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

laravel的chunk方法如何用

發布時間:2022-06-06 15:53:32 來源:億速云 閱讀:536 作者:iii 欄目:編程語言

這篇文章主要介紹“laravel的chunk方法如何用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“laravel的chunk方法如何用”文章能幫助大家解決問題。

在laravel中,chunk()方法用于將集合分割為多個指定大小的較小集合,語法為“$指定集合->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的chunk方法如何用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女