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

时间:2012-11-12 00:23:06

标签: php doctrine-orm

我正在使用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,但这样做会破坏结果缓存的目的。

1 个答案:

答案 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中)。