У меня есть функция репозитория, которая извлекает случайные продукты в зависимости от категории. Я использую кэш 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
Заранее спасибо.
Мне это удалось. Это была ошибка, которую я сделал, пытаясь получить случайные результаты, и запрос всегда отличался, поэтому кеш не был ... –