Laravel 并运行一批结果

Syn*_*kSA 3 php laravel laravel-5.2

我对 Laravelchunkeach分解结果集的功能感到头疼。

我有一张表,其中有一列processed值为0. 如果我运行以下代码,它将遍历所有 13002 条记录。

Record::where(['processed' => 0])->each(function ($record) { 
    Listing::saveRecord($record);
}, 500);
Run Code Online (Sandbox Code Playgroud)

此代码将运行所有 13002 条记录。但是,如果我添加一些代码将记录标记为已处理,事情就会变得非常糟糕。

Record::where(['processed' => 0])->each(function ($record) { 
    $listing_id = Listing::saveRecord($record);

    $record->listing_id = $listing_id;
    $record->processed = 1;
    $record->save();
}, 500);
Run Code Online (Sandbox Code Playgroud)

当此代码运行时,仅处理 6002 条记录。

根据我对事情的理解,在chunk( eachrun through chunk) 的每次迭代中,它正在执行一个新语句。

我是从使用 Yii2 过来的,我对这个举动很满意,除了这个打嗝,它让我把头发拉出来。Yii2 有类似的函数(eachbatch),但它们似乎使用结果集和指针,因此即使您在处理结果时更新表,它也不会影响您的结果集。

在 Laravel 中实际上有更好的方法来做到这一点吗?

小智 6

尝试这个

 Records::where('processed',0)->chunk(100, function($records){
    foreach($records as $record)
    {
      //  do your stuff... 
    }
 });
Run Code Online (Sandbox Code Playgroud)

https://laravel.com/docs/5.3/queries#chunking-results

抱歉,在我的手机上出现了缩进,这显然不起作用..

  • 这实际上就是 `each` 函数所做的。https://github.com/laravel/framework/blob/5.2/src/Illuminate/Database/Eloquent/Builder.php#L418 (2认同)