0

下面这个问题。使用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 执行就像一个魅力?

4

1 回答 1

1

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

于 2015-03-14T01:31:09.310 回答