CDbMigration :: update在foreach循环中不起作用

时间:2015-03-13 21:44:58

标签: yii sql-update database-migration yii-migrations

关注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执行就像魅力?

1 个答案:

答案 0 :(得分:1)

我认为您没有正确提供条件参数@ array('id = '.$menuId) 。如果你想像这样发送它,你应该使用一个字符串,把它放在一个数组中假设你在一个键中映射条件=>价值对。您还应该将值约束包装在引号id = "$menuId"中。