更新 Laravel Eloquent 模型两次


Update a Laravel Eloquent model twice

我使用 Laravel Eloquent 模型获得 20 行,使用以下代码,我想在获取它们后将它们标记为锁定,然后在完成工作后将它们标记为解锁。但是,未执行article_unlock更新为 0。

$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));

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

实际上,您的构建器($articles_object)创建了查询的基础。

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

UPDATE `articles`
SET `article_lock` = 1
WHERE `article_posted` = 0
    AND `article_lock` = 0
LIMIT 20

这会将 20 行上的锁定标志设置为 1(因为 take()

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

这意味着当您执行第二次调用以update()与上述运行完全相同的查询时。

这里的区别在于,你的 where 子句WHERE article_lock = 0意味着它永远不会找到与以前相同的行,因为你刚刚在它们上将 article_lock 设置为 1。

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

$lockedIds = [];
foreach($articles as $article)
{
'' do the work
    $lockedIds[] = $article->id;
}
Articles::whereIn('id', $lockedIds)->update(['article_lock' => 0]);