2012-11-12 15 views
6

私はDoctrine 2.2.2を使用して、ユーザーの企業と一緒にユーザーエンティティのクエリを実行しようとしています。内部のデータは頻繁には変更されないため、このクエリをキャッシュする必要があります。Doctrineの結果キャッシュが結合を伴うクエリをキャッシュしない

$user = $em->createQuery(' 
    SELECT u, c 
    FROM Entities\User u 
    LEFT JOIN u.company c 
    WHERE u.id = :id 
')->setParameter('id', $identity)->useResultCache(true, 21600, 'user_' . $identity)->getResult(); 

一見、ユーザエンティティがキャッシュされているが、それはまだ会社のためのクエリを行います。以下は、私が試したものです。同時に両方をフェッチして結果キャッシュに入れる方法はありますか?

私はthisを見つけましたが、それは非常に古く、彼のソリューションは私のためには機能しませんでした。

私にはthisを実行することが提案されましたが、そのような種類のキャッシュは結果キャッシュの目的を破ります。

+0

私は教義を知らないが、あなたは、MySQL内部キャッシュを試してみることができます。id – nfo

+0

便利ではありません。SQL_CACHE Uを選択して、 Cエンティティ\ユーザーからのuが LEFT u.id = u.company C を登録しよう。 Doctrineエンティティのすべてのものを使用できるようにしたい。 – tubaguy50035

+1

EAGERフェッチを(レイジーの代わりに)強制してみてください。リレーション定義にfetch = "EAGER"を追加する必要があります。 – Cyprian

答えて

1

私が使用して教義2.3でこれをテストしてみた:私はそれを最初に実行するとき

$q->setResultCacheDriver(new \Doctrine\Common\Cache\ApcCache()) 
    ->setResultCacheLifetime(21600) 
    ->setResultCacheId('user_' . $identity); 

が、私は私のsql-ロガーで実際のクエリを参照してください。
私は2番目、3番目などの時間を実行すると、私は私のSQLロガーで何も表示されません。

私の結論はうまくいきます。

結果キャッシュが設定されていないか、または非永続的な結果キャッシュ(ArrayCacheなど)が設定されているか、Dontrine 2.2.2のバグです(見つからないジラについては何でも)。

PS:Doctrine 2.3にアップグレードした別の質問(Doctrine detaching, caching, and merging)から集めました。あなたはまだこの問題がありますか?

PPS:Doctrine 2.0(私はそれが2.2だったと思います)のどこかで、結果キャッシュが変更されました。水和結果をキャッシュする代わりに、sql-resultがキャッシュされます(水和は実行ごとに実行されます)。水和結果をキャッシュする場合は、水和キャッシュを使用する必要があります(ただし、結果はではなく、がEntityManagerにマージされていることを確認してください)。

+0

これに対する私の解決策は、私自身の "結果キャッシュ"を作成することでした。それがもう一つの質問です。 – tubaguy50035

関連する問題