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 计数最后执行的语句。
这段代码工作正常(所有数据库项目都按预期更新):
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 计数最后执行的语句。