我正在使用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,但这样做会破坏结果缓存的目的。
答案 0 :(得分:1)
我使用:
对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结果(每次运行都会发生水合作用)。如果你想缓存水合结果,你将不得不使用水合缓存(但是那些结果不合并到EntityManager中)。