Doctrine and Symfony:魔术方法和缓存



我目前正在实现教义结果缓存,所以我已经设置

result_cache_driver: apc

到我的配置中。

然后我正确地让查询缓存在存储库中工作,例如使用

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

当我在教义中使用这些东西时,第一个问题就来了:

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

这也许可以在存储库中轻松覆盖。

我无法解决的问题是使用ParamConverter来使用学说缓存和实体关联。

例如,如果我有一个团队实体,与玩家有一对多关系,我通常会这样做

$team->getPlayers()

我无法控制该查询的缓存。这在某种程度上可能吗?

当你运行像find/findBy这样的方法或在PersistentCollection上处理$team->getPlayers()时,有UoW使用EntityPersister和ObjectHydrator加载数据来水化对象。这些对象不支持结果缓存驱动程序。

另一方面,当您使用 DQL 或 QueryBuilder 时,您的代码会产生扩展 AbstractQuery 的 Query 对象。如果你看一下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')->....;

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

相关内容

  • 没有找到相关文章