Doctrine和Symfony:魔术方法和缓存

4

我目前正在实现Doctrine结果缓存,因此我已经设置了

result_cache_driver: apc

将其添加到我的配置文件中。

接着,我已经成功地在仓库内启用了查询缓存,例如使用

->setResultCacheId(sprintf('posts_for_user_%d', $userId))

当我在Doctrine中使用这些东西时,首先遇到的问题是:

$repository->findOneBy(array)
$repository->findBy(array)

这可能很容易在存储库中被覆盖。

我无法解决的问题是如何使用ParamConverter使用Doctrine缓存和实体关联。

例如,如果我有一个Team实体与Player的OneToMany关系,我通常会这样做

$team->getPlayers()

我无法控制该查询的缓存。有什么方法可以做到吗?

1个回答

2
当你运行像find/findBy或处理PersistentCollection的方法时,会有一个UoW加载数据,使用EntityPersister和ObjectHydrator将对象进行填充。这些对象没有结果缓存驱动程序支持。
另一方面,当你使用DQL或QueryBuilder时,你的代码产生了继承AbstractQuery的Query对象。如果你查看AbstractQuery::execute内部,你会看到这段漂亮的代码,它使得使用结果缓存驱动程序成为可能。
$cache             = $queryCacheProfile->getResultCacheDriver();
$result            = $cache->fetch($cacheKey);

if (isset($result[$realCacheKey])) {
    return $result[$realCacheKey];
}

我的建议是 - 尝试使用 QueryBuilder 和左连接加载您的实体的子集合。

$this->createQueryBuilder('x')->select('x, p')->leftJoin('x.players', 'p')->....;

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


请问UoW是什么意思? 所以为了正确使用缓存及其所有功能,我应该在存储库函数内部实现缓存? - alex88
1
UoW = UnitOfWork 类。您应该使用结果缓存驱动程序 + 查询对象(使用 QueryBuilder 或手动方式生成)。 - Ziumin
我会再等几天,如果没有新的回复,我就接受你的答案。 - alex88

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接