1

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

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

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

4

1 回答 1

1

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

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

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

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

于 2015-03-14T08:49:01.740 回答