Laravel在每次夹紧完成后都会执行操作?

Laravel在每次夹紧完成后都会执行操作?

问题描述:

让我们下面的例子:Laravel在每次夹紧完成后都会执行操作?

User::where('is_active', true)->each(function (User $user){ 
    // do something 

}, 500); 

所以,如果我有2000个用户,有没有办法,每次做一些用户端的新块?

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

如果你想使用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