1

DoctrineでこのDQLを使用しました

$q->update('product')
->set('quantity','?')
->where('id=?');
$q->execute(array(20,5));

サーバーでクエリを確認すると、これが生成されたSQLです

    UPDATE product SET quantity = '20', updated_at = '5' 
WHERE (id = '2010-04-26 14:34); 

では、引数が正しい場所にない理由を知る必要がありますか?

4

1 に答える 1

0

私は数日前にまったく同じバグに巻き込まれました。Timestampable 動作のバグが原因だと思います。Product モデルで有効にしていると思いますが、Doctrine は一連のフィールドに updated_at フィールドを追加して更新 (SET) し、その後に SQL パラメーターがあるという事実に注意を払いません (where 句内)。 )。Timestampable が関与していないため、SELECT を実行するときにこのバグが発生することはありません。

私が見つけた唯一の解決策は、実行の配列パラメーターではなく、クエリを作成するときにパラメーターを提供することであり、Doctrine は混乱しません。このような:

$q->update('product')
 ->set('quantity', 20)
 ->where('id = ?', 5);
$q->execute();

ただし、同じクエリを異なる値で何度も実行する必要がある場合は、準備フェーズと実行フェーズを分離することによるパフォーマンス上の利点が失われます。これが唯一の解決策のようです。

パフォーマンスを低下させずに解決できる可能性のある解決策: これは確認していませんが、匿名の代わりに名前付きパラメーターを使用した場合にバグが表面化しないことを願っています ? プレースホルダー。名前付きパラメータに対する Doctrine のサポートについては、http: //www.doctrine-project.org/documentation/manual/1_2/en/dql-doctrine-query-languageで説明されています。

編集:それ以来、名前付きパラメーターを使用して別のアプローチを試みましたが、残念ながらバグが残っています。Doctrine は、同じクエリで名前付きパラメーターと匿名パラメーターを混在させることはできないというエラーを出します。これは、IMOのずっと前に修正されているはずです。

于 2011-04-23T04:27:43.177 に答える