Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel和正在运行的一批结果_Php_Laravel_Laravel 5.2 - Fatal编程技术网

Php Laravel和正在运行的一批结果

Php Laravel和正在运行的一批结果,php,laravel,laravel-5.2,Php,Laravel,Laravel 5.2,Laravel的chunk和each用于分解结果集的功能让我头疼不已 我有一个表,其中有一列已处理,其值为0。如果我运行以下代码,它将遍历所有13002条记录 Record::where(['processed' => 0])->each(function ($record) { Listing::saveRecord($record); }, 500); 此代码将在所有13002条记录中运行。然而,如果我添加一些代码来将记录标记为已处理,事情就会变得可怕的梨形 Reco

Laravel的
chunk
each
用于分解结果集的功能让我头疼不已

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

Record::where(['processed' => 0])->each(function ($record) { 
    Listing::saveRecord($record);
}, 500);
此代码将在所有13002条记录中运行。然而,如果我添加一些代码来将记录标记为已处理,事情就会变得可怕的梨形

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

    $record->listing_id = $listing_id;
    $record->processed = 1;
    $record->save();
}, 500);
运行此代码时,仅处理6002条记录

根据我对事物的理解,在
的每次迭代中(
每个
都贯穿
),它都在执行一个新语句

我是从使用Yii2而来的,我对这个动作非常满意,除了这个打嗝,它让我毛骨悚然。Yii2具有类似的函数(
每个
批处理
),但它们似乎使用结果集和指针,因此即使在处理结果时更新表,也不会影响结果集

在Laravel中有更好的方法吗?

试试这个

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


很抱歉在我的手机上出现缩进,但这似乎不起作用。

为什么不直接进行实际的foreach循环呢?沿着
$records=Record::where('processed',false)->get()进行的操作
然后是foreach($records as$record)?顺便说一下,你用的是雄辩的模型,对吗?如果是这样,您的型号名称应该是单数的(即,
Record
而不是
Records
)。因为我不想将所有记录加载到内存中,因为我遇到了内存错误。
每个
的要点是,您不必将所有结果加载到内存中,因此您可以遍历要处理的结果集中较小的“块”,因此使用的内存更少。至于记录类名称,您是对的,我做了更改,但这只是示例代码。我知道这是一个古老的问题,但为什么不存储另一个您在处理过程中未选择的标志,例如
(bool)completed
?然后运行类似于
updatelistingsetprocessed=true的操作,其中completed=true完成后。嘿@SynackSA最后你的解决方案是什么?这就是
每个
函数所做的。