【问题标题】:CDbMigration::update does not work inside foreach loopCDbMigration::update 在 foreach 循环中不起作用
【发布时间】:2015-03-13 21:44:58
【问题描述】:

关注this question。在foreach 循环中使用CDbMigration::update() 时出现问题。

此代码无法正常工作:

//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 却很神奇?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2020-05-27
      • 2014-04-28
      • 1970-01-01
      • 1970-01-01
      • 2017-05-28
      • 1970-01-01
      • 2021-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多