CDbCommand :: createCommand()在迁移中返回零受影响的行

时间:2015-03-13 21:56:38

标签: sql yii database-migration rows-affected yii-migrations

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

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应该返回受执行影响的行数。在迁移中使用时,此功能是否有效?

1 个答案:

答案 0 :(得分:1)

CDbCommand :: execute从基础PDO接口返回行Count,PDOstatement::rowCount仅返回最后一个语句的行数。

我在迁移过程中对此进行了测试,以确保迁移脚本没有运行任何其他清理命令等,但事实并非如此,我也可以从迁移内外获取正确的行值。

由于更新命令而导致值为0的最可能原因是因为更新命令没有影响任何行(即链接值已经设置为正确的值),如果没有发生更改,UPDATE将返回0。 也许您已经在测试数据库上运行迁移并向下迁移以对其进行多次测试,但是在后续过程中没有实际更新。

请注意,在第二个场景中,只有最后一个命令的计数(即使update更改了表,也会显示单行更新,因为PDOstatement :: rowCount只返回执行的最后一个语句的计数。