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



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

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 rowsn";
}

但它为每个执行的查询打印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 rowsn";

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

CDbCommand::execute 从底层 PDO 接口返回行计数,PDOstatement::rowCount 仅返回最后一条语句的行计数。

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

您获得 0 作为值的最可能原因是因为 update 命令不影响任何行(即链接值已经设置为正确的值),如果没有发生任何更改,UPDATE 将返回 0。也许您已经在测试数据库上运行了迁移并向下迁移以测试它几次,但是在随后的传递中实际上没有发生任何更新。

请注意,在第二种情况下,仅显示最后一个命令的计数(即使更新更改了表,也会显示单行更新,因为 PDOstatement::rowCount 仅返回执行的最后一个语句的计数。

相关内容

  • 没有找到相关文章

最新更新