2014-11-16 221 views
2

我使用Laravel雄辯模型獲得20行,使用下面的代碼,我想在獲得它們後將它們標記爲鎖定,然後在完成與它們的工作後將其標記爲解鎖。但是article_unlock更新爲0沒有被執行。更新Laravel雄辯模型

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

回答

4

發生這種情況是因爲您正在重新使用構建器對象而不是數據集。

實際上會發生什麼是您的Builder($articles_object)創建查詢的基礎。

當您在此Builder對象上運行更新方法時,它會創建並運行查詢。

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

這將鎖標誌,以1對(因爲take()

的生成器對象仍然即使您運行此查詢生成器對象中的20行,也沒有行它的概念最初運行更新。這不是像你從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]);