我正在实现doctrine结果缓存,所以我已经设置好了
result_cache_driver: apc
进入我的配置.
然后我正确地使用查询缓存在Repository中工作,例如
->setResultCacheId(sprintf('posts_for_user_%d', $userId))
当我在学说中使用这些东西时,第一个问题出现了:
$repository->findOneBy(array)
$repository->findBy(array)
可以在存储库中轻松覆盖.
我无法解决的问题是使用ParamConverter来使用doctrine缓存以及实体关联.
例如,如果我有一个与玩家的OneToMany关系的Team实体,我通常会这样做
$team->getPlayers()
我无法控制该查询的缓存.这有可能吗?
最佳答案 当运行像查找/ findBy或处理过PersistentCollection方法做$team-> getPlayers(),存在UOW它加载使用EntityPersister和ObjectHydrator水合的对象的数据.这些对象不支持结果缓存驱动程序.
另一方面,当您使用DQL或QueryBuilder时,您的代码产品Query对象会扩展AbstractQuery.如果您查看AbstractQuery :: execute,您将看到这段漂亮的代码,它可以使用结果缓存驱动程序
$cache = $queryCacheProfile->getResultCacheDriver();
$result = $cache->fetch($cacheKey);
if (isset($result[$realCacheKey])) {
return $result[$realCacheKey];
}
所以我的建议 – 尝试在子集合上使用QueryBuilder和leftJoins加载实体.
$this->createQueryBuilder('x')->select('x, p')->leftJoin('x.players', 'p')->....;
它将创建使用结果缓存驱动程序的可能性.