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実行されたクエリごとに出力されます。なんで?

1 つの 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 は 0 を返します。おそらく、テスト データベースで既に移行を実行し、それをさらに数回テストするために移行しましたが、その後のパスでは実際には更新が行われませんでした。

2 番目のシナリオでは、最後のコマンドのカウントのみに注意してください (PDOstatement::rowCount は、最後に実行されたステートメントのカウントのみを返すため、更新によってテーブルが変更された場合でも、1 行の更新が表示されます。

于 2015-03-14T08:49:01.740 に答える