2017-04-05 54 views

回答

1
User::where('is_active', true)->chunk(500, function (Collection $users) { 
    $users->each(function (User $user) { 
     // Do per-user stuff here 
    }); 
    // Do per-chunk stuff here 
} 

這應該做的伎倆。請記住,最後一個塊可能包含少於500個用戶。如果必須精確到每500,請檢查收集大小;

User::where('is_active', true)->chunk(500, function (Collection $users) { 
    $users->each(function (User $user) { 
     // Do per-user stuff here 
    }); 
    if ($users->count() == 500) { 
     // Do per-chunk stuff here 
    } 
} 

希望這會有所幫助。

+0

我想知道你測試了嗎?因爲在''each()'調用'chunk()'的引擎下,所以你的代碼就像'chunk()調用調用chunk()的each()。 –

+1

我測試過了。 'each()'調用'chunk()',但'chunk()'不調用each()'是正確的。通過直接調用'chunk()',你可以控制回調參數。 – Sydgren

0

如果你想使用each()幫手,你需要手動完成。難道是這樣的:

$counter = 0; 
$chunk = 500; 

User::where('is_active', true)->each(function (User $user) use(&$counter, $chunk) { 
    // Do stuff for each user. 

    $counter += 1; 
    if ($counter === $chunk) { 
     $counter = 0; 
     // Do something after each chunk. 
     $this->doSomething(); 
    } 
}, $chunk); 

if (!$counter) 
    // Do something for the last chunk. 
    $this->doSomething(); 
} 
+0

不是真的我想用正確的那個,那只是我嘗試過的一個,如果有什麼不需要'$ counter'變量會更好。 – jycr753

+1

@ jycr753我查看了'each()'和'chunk()'源代碼,此刻我看不到更好的解決方案,對不起。 –

+0

是的,我也是這麼做的,這就是爲什麼我在這裏問......也許只是也許有人知道更好/更快/更聰明的方法 – jycr753

相關問題