这段代码工作得很好(所有数据库项目都按预期更新):
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 仅返回执行的最后一个语句的计数。