【问题标题】:Update a Laravel Eloquent model twice两次更新 Laravel Eloquent 模型
【发布时间】:2014-11-16 23:33:40
【问题描述】:

我使用 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));

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    这是因为您重用了构建器对象,而不是数据集。

    实际上发生的是您的 Builder ($articles_object) 创建了查询的基础。

    当您在此 Builder 对象上运行更新方法时,它会创建并运行查询。

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

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

    即使在您运行此查询之后,Builder 对象仍然是一个 Builder 对象,并且不知道它最初运行更新的行的概念。这不是您从 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]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-19
      • 2015-10-23
      • 2017-05-08
      • 2015-08-31
      • 2016-08-28
      • 1970-01-01
      相关资源
      最近更新 更多