溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

laravel的chunk方法如何用

發(fā)布時(shí)間:2022-06-06 15:53:32 來(lái)源:億速云 閱讀:490 作者:iii 欄目:編程語(yǔ)言

這篇文章主要介紹“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電腦。

laravel的chunk方法怎么用

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)。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI