关注this question。在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执行就像魅力?
答案 0 :(得分:1)
我认为您没有正确提供条件参数@ array('id = '.$menuId)
。如果你想像这样发送它,你应该使用一个字符串,把它放在一个数组中假设你在一个键中映射条件=>价值对。您还应该将值约束包装在引号id = "$menuId"
中。