Php Laravel和正在运行的一批结果
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
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最后你的解决方案是什么?这就是每个
函数所做的。