2012-02-17 24 views
0

ここで質問を投稿する前に回答を見つける傾向がありますが、今日は何が間違っているかわかりません。LEFT JOIN ... WITH条件付きDoctrine結果キャッシュバグ

Symfony 2アプリでDoctrine 2.1.2を使用しています。リポジトリには、ほぼ同じクエリを使用する2つのメソッドがあります。 メソッドAとメソッドBの唯一の違いは、両方のクエリに共通するJOINに条件が追加されていることです。

Doctrineは両方のクエリで同じ結果キャッシュを使用しているようです。 メソッドAを呼び出すと、メソッドBはAのキャッシュを使用します。

私はexpireResultCache(true)とuseResultCache(false)を使用していません。ここで

は、クエリがどのように見えるかです:私はgetSQL()を使用する場合

-- method A 

SELECT DISTINCT a, b, c FROM MyBundle:ObjectA a INDEX BY a.id 
LEFT JOIN a.fkObjectB b 
LEFT JOIN a.fkObjectC c 

-- method B 
SELECT DISTINCT a, b, c FROM MyBundle:ObjectA a INDEX BY a.id 
LEFT JOIN a.fkObjectB b WITH b.some_field IS NULL 
LEFT JOIN a.fkObjectC c 

、私は予想通り、彼らは別のクエリにつながることがわかります。生成されたクエリは、データベース内で独立して実行されると、異なる結果を生成します。

これは、DoctrineがJOINの条件をキャッシュせず、テーブル名だけをキャッシュする、厄介な結果キャッシュのバグであると信じています。

これはバグですか、それとも私ができることはありますか?

EDIT Doctrine 2.1.6でも同様のことが起こります。

答えて

0

問題はDoctrine 2.2で修正されていると思います。結果キャッシュに関連する同様の問題があります。ここにはmy question&answersがあります。

+0

誰かがこの古い質問に絡み合った場合に備えて:問題は椅子とキーボードの間にありました。 管理対象エンティティの配列コレクションプロパティが同じままであり、連続するクエリによって更新されないという事実を考慮していませんでした。 –

0

michel v's commentに拡張するだけで、Doctrine 2は同じオブジェクトインスタンスをidentity map pattern経由で両方ともフェッチしています。

呼び出し:

EntityManager#clear() 

は、アイデンティティ・マップをクリアして、データベースからオブジェクトの新しいコピーを取得するためにEntityManagerを強制します。