私はGedmo Doctrine 拡張機能
を使用し
ています。翻訳キャッシュを除いて、これまでのところすべてうまく機能しています。
$entity = $repository
->findByIdFullData($id)
->setHint(\Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER, 'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker')
->useResultCache(true, $cache_time, $cache_name)
->getOneOrNullResult();
findByIdFullData()
戻ります\Doctrine\ORM\Query
が、翻訳はキャッシュされません。プロファイラーでは、次のようなクエリが表示されます。
SELECT
e0_.content AS content0,
e0_.field AS field1
FROM
ext_translations e0_
WHERE
e0_.foreign_key = ?
AND e0_.locale = ?
AND e0_.object_class = ?
また、プロファイラーのすべてのクエリは から結果を取得しますext_translations
。翻訳された文字列ですでに結果をキャッシュするにはどうすればよいですか?
Array Hydration と memCache を使用してみましたが、結果アイテムがシリアル化できないメディア ファイルなどをアップロードしたため、さらに混乱してしまいました。とにかく、ほとんどのコードを書き直すことになります。
どんな助けでも大歓迎です。
編集:
Karol Wojciechowski の答えを試してみたところ、問題の一部が解決しました。使用するとキャッシュされますが、使用するとキャッシュされgetOneOrNullResult()
ませんgetResult()
。ここにいくつかのコードがあります。
サービスで:
$query = $this->em
->getRepository('MainBundle:Channels')
->findActiveChannelsByGroupId($id);
$this->container->get('my.translations')->addTranslationWalkerToQuery($query, $this->request);
$channels = $query
->useResultCache(true, 900, '1__channels__active_by_group_1')
->getResult();
チャネル リポジトリ:
public function findActiveChannelsByGroupId($group_id, $limit = null)
{
$rs = $this
->createQueryBuilder('c')
->select('c', 'm')
->leftJoin('c.media', 'm')
->leftJoin('c.group', 'g')
->where('c.active = 1')
->andWhere('g.id = :group_id')
->orderBy('c.sortOrder', 'asc')
->setParameter('group_id', $group_id)
->setMaxResults($limit);
return $rs->getQuery();
}
(notice limit param)に変更しfindActiveChannelsByGroupId($id, 1)
てもキャッシュされませんが、に変更するgetOneOrNullResult()
とクエリがキャッシュされます