1

私は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()とクエリがキャッシュされます

4

1 に答える 1