2014-11-26 4 views
0

У меня есть функция репозитория, которая извлекает случайные продукты в зависимости от категории. Я использую кэш APC для кэширования результатов и случайных продуктов только тогда, когда истек кеш. Все работает хорошо, за исключением того, что изображения для продукта не сохраняются в кеше. Платформа Entity Продукт имеет OneToMany отношение к ProductImages Entity вроде этого:symfony 2 doctrine query builder Apc cache не сохраняет объекты коллекции

/** 
* @var arrayCollection 
* 
* @ORM\OneToMany(targetEntity="ProductImage", mappedBy="product", cascade={"persist", "remove"}, orphanRemoval=true) 
*/ 
private $images; 

public function __construct() 
{ 
    $this->images = new ArrayCollection(); 
} 

/** 
* @var Product 
* 
* @ORM\ManyToOne(targetEntity="Product", inversedBy="images") 
* @ORM\JoinColumn(name="product_id", referencedColumnName="id") 
*/ 
private $product; 

Мой репозиторий функции:

/** 
* @param $category 
* @param $limit 
* @param $source 
* @param $cacheExpiresTime 
* @return \Doctrine\ORM\Query 
*/ 
public function findByCategoryLimit($category, $limit, $source, $cacheExpiresTime = 3600) 
{ 
    $cacheDriver = new ApcCache(); 
    $cacheId = 'category_'.$category->getId().'_products'; 
    $config = $this->getEntityManager()->getConfiguration(); 
    $config->setResultCacheImpl($cacheDriver); 
    if ($config->getResultCacheImpl()->contains($cacheId)) 
    { 
     return $config->getResultCacheImpl()->fetch($cacheId); 
    } 
    $qb = $this->createQueryBuilder('p'); 
    $qb->select('p') 
     ->leftJoin('p.sourceCategory', 's') 
     ->where('s.category = :category') 
     ->setMaxResults($limit) 
     ->setParameter('category', $category); 
    if (!empty($source)){ 
     $qb->andWhere('p.source = :source'); 
     $qb->setParameter('source', $source); 
    } 
    $qb->orderBy('p.title', 'ASC'); 
    if($this->getCategoryTotalProducts($category) > $limit) { 
     $qb->setFirstResult(rand(1, ($this->getCategoryTotalProducts($category) - $limit))); 
    } 
    $query = $qb->getQuery(); 
    //$query->setResultCacheDriver($cacheDriver); 
    //$query->useResultCache(true, $cacheExpiresTime, $cacheId); 
    $result = $query->getResult(); 
    $config->getResultCacheImpl()->save($cacheId, $result, $cacheExpiresTime); 

    return $result; 

} 

Когда продукт загружается из БД изображения выглядят просто отлично, но при загрузке из кэша изображения исчезли (пустые). Что я здесь делаю неправильно? Я пробовал разные подходы и искал решение без успеха. $ cacheExpiresTime установлен на 20

Заранее спасибо.

ответ

0

Вы пытались загружать изображения? (Добавить соединение и выбрать запрос). Это обходной путь, который я знаю :)

+0

Мне это удалось. Это была ошибка, которую я сделал, пытаясь получить случайные результаты, и запрос всегда отличался, поэтому кеш не был ... –

0

Проблема заключалась в смещении запроса. Вот решение. Теперь он работает так, как ожидалось.

/** 
* @param $category 
* @param $limit 
* @param $source 
* @param $cacheExpiresTime 
* @return \Doctrine\ORM\Query 
*/ 
public function findByCategoryLimit($category, $limit, $source, $cacheExpiresTime = 3600) 
{ 
    $cacheDriver = new ApcCache(); 
    $cacheId = 'category_'.$category->getId().'_products'; 
    $config = $this->getEntityManager()->getConfiguration(); 
    $config->setResultCacheImpl($cacheDriver); 
    $offset = 0; 
    if($this->getCategoryTotalProducts($category) > $limit) { 
     $offset = rand(1, ($this->getCategoryTotalProducts($category) - $limit)); 
    } 

    if ($config->getResultCacheImpl()->contains($cacheId)) 
    { 
     $offset = $config->getResultCacheImpl()->fetch($cacheId); 
    } 

    $qb = $this->createQueryBuilder('p'); 
    $qb->select('p') 
     ->leftJoin('p.sourceCategory', 's') 
     ->where('s.category = :category') 
     ->setMaxResults($limit) 
     ->setParameter('category', $category); 
    if (!empty($source)){ 
     $qb->andWhere('p.source = :source'); 
     $qb->setParameter('source', $source); 
    } 
    $qb->orderBy('p.title', 'ASC'); 
    $qb->setFirstResult($offset); 

    $query = $qb->getQuery(); 
    $query->useQueryCache(true); 
    $query->useResultCache(true); 
    $result = $query->getResult(); 
    if (!$config->getResultCacheImpl()->contains($cacheId)) { 
     $config->getResultCacheImpl()->save($cacheId, $offset, $cacheExpiresTime); 
    } 

    return $result; 

}