Doctrine和Symfony:魔术方法和缓存

时间:2012-11-19 18:39:27

标签: symfony doctrine doctrine-orm symfony-2.1

我目前正在实施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()

我无法控制该查询的缓存。这有可能吗?

1 个答案:

答案 0 :(得分:2)

当你运行像find / findBy这样的方法或通过执行$ team-> getPlayers()的PersistentCollection进行处理时,有一个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')->....;

它将创建使用结果缓存驱动程序的可能性。