使用Yii的updateAll()更新多行

时间:2016-01-03 13:08:44

标签: php yii2

我正在尝试更新Yii中的多行:

$list = array(1, 2, 3, 4, 5);

foreach($list as $id) {
    $query = "UPDATE products SET photos=crawler.photos, status=crawler.status WHERE id=crawler.product_id AND crawler.product_id=$id;";
}

我是Yii的新手。基本上,我想使用表products中的值更新表scrape中的行(使用来自id的特定$list)。但不是foreach(),而是updateAll()

3 个答案:

答案 0 :(得分:1)

我认为应该是这样的事情

public function actionMyProductsUpdate($id)
{
    foreach ($queue as $item) {
        $myUpdate = "UPDATE products as a join crawler as b 
        on  (  a.id=b.product_id  and b.product_id= $item->id)
        SET a.photos=b.photos, a.status=b.status;";
         \Yii::$app->db->createCommand($myUpdate)->execute();    
    }

}

第2版

public function actionMyProductsUpdate($id)
{

        $myUpdate = "UPDATE products as a join crawler as b 
        on  (  a.id=b.product_id  and b.product_id in  $list )
        SET a.photos=b.photos, a.status=b.status;";
         \Yii::$app->db->createCommand($myUpdate)->execute();    


}

答案 1 :(得分:0)

我知道这是一个老问题,但是我在研究更复杂的东西时碰到了这个问题。如果我正确地理解了意图,这应该可以工作:

Yii::$app->db->createCommand(
    "UPDATE products p, crawler c
        SET p.photos = c.photos, p.status = c.status
        WHERE p.id = c.product_id;"
            )->execute();

(我更喜欢直接联接语法,尤其是在更新中使用联接的情况下。)

答案 2 :(得分:0)

活动目录模式。很好的写模式。

$movies_updated = SomeModel::updateAll([
     'language' => 'pl',
     'age' => 3,
], ['id' => 1]); # condition