我正在尝试更新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()
。
答案 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