4

私は現在、教義の結果キャッシュを実装しているので、設定しました

result_cache_driver: apc

私の構成に。

次に、たとえば、リポジトリ内でクエリキャッシュが正しく機能するようになりました

->setResultCacheId(sprintf('posts_for_user_%d', $userId))

私が教義でこれらのものを使用したときに最初の問題が起こります:

$repository->findOneBy(array)
$repository->findBy(array)

これは、リポジトリで簡単に上書きできる可能性があります。

私が乗り越えられない問題は、ParamConverterを使用してドクトリンキャッシングとエンティティの関連付けを使用することです。

たとえば、PlayerとOneToManyの関係を持つTeamエンティティがある場合、通常は

$team->getPlayers()

そのクエリのキャッシュを制御することはできません。それは何らかの方法で可能ですか?

4

1 に答える 1

2

$team->getPlayers() を実行して PersistentCollection に対して find/findBy やプロセスなどのメソッドを実行すると、EntityPersister と ObjectHydrator を使用してデータをロードし、オブジェクトをハイドレートする UoW があります。これらのオブジェクトは、結果キャッシュ ドライバーをサポートしていません。

一方、DQL または QueryBuilder を使用する場合、コードは AbstractQuery を拡張する Query オブジェクトを生成します。AbstractQuery::execute の内部を見ると、結果キャッシュ ドライバーの使用を可能にするこのきれいなコードが表示されます。

$cache             = $queryCacheProfile->getResultCacheDriver();
$result            = $cache->fetch($cacheKey);

if (isset($result[$realCacheKey])) {
    return $result[$realCacheKey];
}

だから私の提案 - QueryBuilder と leftJoins を子コレクションに使用してエンティティをロードしてみてください。

$this->createQueryBuilder('x')->select('x, p')->leftJoin('x.players', 'p')->....;

これにより、結果キャッシュ ドライバーを使用できるようになります。

于 2012-11-19T19:42:02.860 に答える