CDbCommand::createCommand() returns 迁移中受影响的行数为零

CDbCommand::createCommand() returns zero affected rows inside migration

这段代码工作正常(所有数据库项目都按预期更新):

foreach($idMap as $menuId=>$pageId)
{
    $sql = "UPDATE `menus_items` SET link = '/content/show?id=".$pageId."' WHERE id = ".$menuId."; ";

    $affectedRows = Yii::app()->db->createCommand($sql)->execute();

    echo $affectedRows." affected rows\n";
}

但是它会为每个执行的查询打印 0 affected rows。为什么?

同样的效果是,当在一个 SQL 查询中执行许多影响语句的行时:

$sql = '';

foreach($idMap as $menuId=>$pageId)
{
    $sql .= "UPDATE `menus_items` SET link = '/content/show?id=".$pageId."' WHERE id = ".$menuId."; ";
}

$affectedRows = Yii::app()->db->createCommand($sql)->execute();
echo $affectedRows." affected rows\n";

我错过了什么?文档说,CDbCommand::execute 应该 return 受执行影响的行数。当在迁移中使用时,此功能是否有效?

CDbCommand::execute returns 来自底层 PDO 接口的行数,PDOstatement::rowCount 仅 returns 最后一条语句的行数。

我已经在迁移中对此进行了测试,以确保迁移脚本不会 运行ning 任何其他用于清理等的命令,事实并非如此,我能够从内部和外部获得正确的行值迁移也是如此。

您得到 0 作为值的最可能原因是因为更新命令没有影响任何行(即 link 值已经设置为正确的值),UPDATE 将 return 0 如果没有发生变化。 也许您已经 运行 在您的测试数据库上迁移并向下迁移以对其进行多次测试,但是在随后的传递过程中实际上没有发生任何更新。

请注意,在第二种情况下,只有最后一个命令的计数(即使更新将 table 更改为 PDOstatement::rowCount,也只会显示单行更新 returns 计数最后执行的语句。