我对Laravel的ORM Eloquent chunk()方法有疑问。
它错过了一些结果。
这是一个测试查询:

$destinataires = Destinataire::where('statut', '<', 3)
    ->where('tokenized_at', '<', $date_active)
    ->chunk($this->chunk, function ($destinataires) {
        foreach($destinataires as $destinataire) {
            $this->i++;
        }
    }
echo $this->i;

它给出124838个结果。

但 :
$num_dest = Destinataire::where('statut', '<', 3)
    ->where('tokenized_at', '<', $date_active)
    ->count();
echo $num_dest;

给出249676,因此仅TWICE作为第一个代码示例。

我的脚本应该编辑数据库中所有匹配的记录。如果我多次启动它,则每次仅分发剩余记录的一半。

我尝试使用DB::table()而不是Model。
我尝试添加-> take(20000),但似乎未考虑在内。
我用-> toSql()回显了查询,并且eveything看起来还不错(当我添加-> take()参数时,就添加了LIMIT子句)。

有什么建议 ?

最佳答案

快速解答:使用chunkById()代替chunk()

可以在Laravel documentation中找到的说明:



这是解决方案示例:

DB::table('users')->where('active', false)
    ->chunkById(100, function ($users) {
        foreach ($users as $user) {
            DB::table('users')
                ->where('id', $user->id)
                ->update(['active' => true]);
        }
    });



(更新结束)

原始答案:

我遇到了同样的问题-总结果中只有一半传递给 chunk()方法的回调函数。

这是有问题的代码:
Transaction::whereNull('processed')->chunk(100, function ($transactions) {
    $transactions->each(function($transaction){
        $transaction->process();
    });
});

我使用了Laravel 5.4,并设法解决了用 cursor()方法替换 chunk()方法并相应地更改代码的问题:
foreach (Transaction::whereNull('processed')->cursor() as $transaction) {
    $transaction->process();
}

即使答案不能解决问题本身,也可以提供有值(value)的解决方案。

关于php - Eloquent chunk()遗漏了一半的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32700537/

10-13 01:34