gpt4 book ai didi

php - Doctrine 结果缓存不缓存带有连接的查询

转载 作者:可可西里 更新时间:2023-11-01 13:30:49 25 4
gpt4 key购买 nike

我正在使用 Doctrine 2.2.2 尝试查询用户实体以及用户的公司。我希望缓存此查询,因为其中的数据不会经常更改(如果有的话)。以下是我尝试过的:

$user = $em->createQuery('
SELECT u, c
FROM Entities\User u
LEFT JOIN u.company c
WHERE u.id = :id
')->setParameter('id', $identity)->useResultCache(true, 21600, 'user_' . $identity)->getResult();

看似缓存了用户实体,但它仍然对公司进行查询。有没有办法可以同时获取两者并将它们放入结果缓存中?

我确实找到了 this ,但它已经很旧了,他的解决方案对我不起作用。

有人建议我做 this , 但这种做法违背了结果缓存的目的。

最佳答案

我已经使用 Doctrine 2.3 测试了这个:

$q->setResultCacheDriver( new \Doctrine\Common\Cache\ApcCache() )
->setResultCacheLifetime( 21600 )
->setResultCacheId( 'user_' . $identity );

当我第一次运行它时,我在我的 sql-logger 中看到了实际的查询。
当我第二次、第三次等运行它时,我的 sql-logger 中没有看到任何内容。

我的结论是它运行良好。

我猜你要么没有配置结果缓存,要么配置了非永久性结果缓存(如 ArrayCache),或者这是 Dontrine 2.2.2 中的一个错误(虽然我找不到任何东西关于它在 jira 上)。

PS:我从另一个问题 (Doctrine detaching, caching, and merging) 得知您已升级到 Doctrine 2.3。你还有这个问题吗?

PPS:在 Doctrine 2.0(我认为是 2.2)之后的某个地方,结果缓存发生了变化。不是缓存水合结果,而是缓存 sql-result(并且每次运行都会发生水合)。如果您想缓存水合结果,则必须使用水合缓存(但请注意,这些结果不会合并到 EntityManager 中)。

关于php - Doctrine 结果缓存不缓存带有连接的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13336953/

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