gpt4 book ai didi

symfony - Doctrine 和 Symfony : magic methods and caching

转载 作者:行者123 更新时间:2023-12-01 04:01:05 25 4
gpt4 key购买 nike

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

result_cache_driver: apc

进入我的配置。

然后我正确地让查询缓存在存储库中工作,例如使用
->setResultCacheId(sprintf('posts_for_user_%d', $userId))

当我在 Doctrine 中使用这些东西时,第一个问题出现了:
$repository->findOneBy(array)
$repository->findBy(array)

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

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

例如,如果我有一个与 Player 有 OneToMany 关系的 Team 实体,我通常会这样做
$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')->....;

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

关于symfony - Doctrine 和 Symfony : magic methods and caching,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13460036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com