下面这个问题。使用CDbMigration::update()
内部foreach
循环时出现问题。
此代码无法正常工作:
//This is executed inside Yii migration, so $this is CDbMigration.
foreach($idMap as $menuId=>$pageId)
{
$this->update
(
'menus_items',
array('link'=>'/content/show?id='.$pageId),
array('id = '.$menuId)
);
}
对于$idMap中的每个项目, $pageId的值始终相同,并且等于$idMap数组中最后一个项目的值。因此,每个菜单项都指向同一个 URL。
这段代码就像一个魅力:
foreach($idMap as $menuId=>$pageId)
{
$sql = "UPDATE `menus_items` SET link = '/content/show?id=".$pageId."' WHERE id = ".$menuId."; ";
Yii::app()->db->createCommand($sql)->execute();
}
对于$idMap中的每个项目, $pageId的值总是不同的,并且等于$idMap数组中当前项目的值。因此,每个菜单项都指向正确的 URL。
同理,在一个 SQL 查询中执行所有语句时:
$sql = '';
foreach($idMap as $menuId=>$pageId)
{
$sql .= "UPDATE `menus_items` SET link = '/content/show?id=".$pageId."' WHERE id = ".$menuId."; ";
}
Yii::app()->db->createCommand($sql)->execute();
再次,一切正常。
为什么使用CDbMigration::update()
失败,而直接 SQL 执行就像一个魅力?