2014-12-05 115 views
0

我發現了一個問題,因爲我有 - Symfony2 + Doctrine2 is not caching results of joined entities,但答案沒有幫助,因爲我使用Sf 2.3和Doctrine 2.3.6 。另外,我不使用APC,而是使用MemCache進行查詢和結果緩存。Symfony 2.3和Doctrine 2.2 + Memcache沒有緩存多對多加入關係

config.yml

doctrine: 
    orm: 
     auto_generate_proxy_classes: "%kernel.debug%" 
     auto_mapping: true 
     query_cache_driver: 
      type: memcache 
      host: "%result_memcache_host%" 
      port: "%result_memcache_port%" 
      instance_class: Memcache 
     result_cache_driver: 
      type: memcache 
      host: "%result_memcache_host%" 
      port: "%result_memcache_port%" 
      instance_class: Memcache 

在控制器:

$rs = $this->getEM() 
     ->getRepository('MainBundle:Channels') 
     ->findByIdFullData($id) 
     ->useResultCache(true, 900, 'channel' . $id) 
     ->getOneOrNullResult(); 

在倉庫:

public function findByIdFullData($id) 
{ 
    $rs = $this 
     ->createQueryBuilder('c') 
     ->select('c', 'al') 
     ->leftJoin('c.audioLanguage', 'al') 
     ->where('c.id = :id') 
     ->andWhere('c.active = 1') 
     ->setParameter('id', $id); 

    return $rs->getQuery(); 
} 

audioLanguage是渠道,語言和每一次我得到的查詢時間之間的多對多關係嘗試訪問它在樹枝或撥打DB

什麼可能是錯的?
謝謝

回答

0

您正在爲每個查詢設置相同的緩存鍵,從useResultCache中刪除第三個參數。也許你應該指定水化模式getOneOrNullResultDoctrine\ORM\AbstractQuery::HYDRATE_OBJECT?祝你好運。

+0

對不起,混亂,我使用唯一的緩存名稱名稱,只是在問題中清除了一些不必要的代碼(現在編輯):)根據您的建議設置水化模式也不會改變任何內容。順便說一下,我使用了來自Doctrine擴展的Translatable,並且在那裏設置了Object水化。 – CRONUS 2014-12-05 08:52:06

+0

看看我的其他答案:http://stackoverflow.com/questions/27169763/symfony-2-3-gedmo-doctrine-extensions-translatable-caching/27173280#27173280 – 2014-12-05 09:09:30

+0

我不認爲這是相關的。即使沒有可翻譯的多對多關係也不會被緩存。 – CRONUS 2014-12-05 10:00:32

0

在我們的項目主體工程(教義2.4),我們有一個自定義緩存標記功能,每一個緩存的查詢是通過這個方法來處理(它重新設置resultCacheDriver,每次查詢):

public function add($query, $lifetime = null) 
    { 
     $ownRedis = new RedisCache(); 
     /** @var $query Query */ 
     $query->useResultCache(true,$lifetime); 
     $redis = $query->getQueryCacheProfile()->getResultCacheDriver(); 
     $ownRedis->setRedis($redis->getRedis()); 
     $query->setResultCacheDriver($ownRedis); 
     self::$_queries[] = $query; 
    }