Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.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_Eloquent - Fatal编程技术网

Php 两次更新Laravel雄辩的模型

Php 两次更新Laravel雄辩的模型,php,laravel,eloquent,Php,Laravel,Eloquent,我使用Laravel Eloquent模型得到20行,使用下面的代码,我想在得到它们后将它们标记为已锁定,然后在使用它们完成工作后将它们标记为已解锁。但是没有执行对0的项目\u解锁更新 $articles_object = Article::where('article_posted', '=', 0)->where('article_lock', '=', 0)->take(20); $articles_object->update(array('article_lock'

我使用Laravel Eloquent模型得到20行,使用下面的代码,我想在得到它们后将它们标记为已锁定,然后在使用它们完成工作后将它们标记为已解锁。但是没有执行对0的项目\u解锁更新

$articles_object = Article::where('article_posted', '=', 0)->where('article_lock', '=', 0)->take(20);
$articles_object->update(array('article_lock' => 1));
$articles = $articles_object->get();
foreach($articles as $article)
{
\\ do the work
}
$articles_object->update(array('article_lock' => 0));

发生这种情况是因为您正在重用构建器对象,而不是数据集

实际上,您的Builder$articles\u对象创建了查询的基础

在此生成器对象上运行update方法时,它将创建并运行查询

UPDATE `articles`
SET `article_lock` = 1
WHERE `article_posted` = 0
    AND `article_lock` = 0
LIMIT 20
这会将20行上的锁定标志设置为1,因为

即使在运行此查询之后,生成器对象仍然是一个生成器对象,并且对于最初运行更新的行没有概念。这不是你从get那里得到的收藏品

这意味着当您执行第二个调用以更新与上述运行完全相同的查询时

这里的区别是where子句是where article\u lock=0,这意味着它将永远找不到与前面相同的行,因为您刚刚将它们的article\u lock设置为1

您需要跟踪刚刚锁定的ID,可能类似于下面的内容,然后专门对这些记录运行查询以将锁定标志归零

$lockedIds = [];

foreach($articles as $article)
{
\\ do the work

    $lockedIds[] = $article->id;
}

Articles::whereIn('id', $lockedIds)->update(['article_lock' => 0]);