Doctrine结果缓存无法缓存带有联接的查询

6

我正在使用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();

表面上,用户实体已被缓存,但仍然会查询公司。有没有办法同时获取它们并将它们放入结果缓存中?我找到了这个链接,但它很老了,他的解决方案对我不起作用。有人建议我这样做,但那样做有点违背结果缓存的目的。

我不了解Doctrine,但你可以尝试使用MySQL内部缓存:SELECT SQL_CACHE u, c FROM Entities\User u LEFT JOIN u.company c WHERE u.id = :id - nfo
那并不是有帮助的。我想要能够使用Doctrine实体的所有功能。 - nwalke
1
尝试强制使用EAGER取回(而不是lazy)。您必须在关系定义中添加fetch="EAGER"。 - Cyprian
我也尝试过了。没有结果。 - nwalke
根据文档(http://docs.doctrine-project.org/en/latest/reference/caching.html#result-cache)所述,只要查询设置了缓存,就不必显式启用缓存。您是否实际指定了缓存以及使用了哪种缓存? - Jojo
我尝试使用APC缓存驱动程序。正如所述,它确实起作用,但仅适用于第一个实体。它没有遵循关系。 - nwalke
1个回答

1

我已经使用Doctrine 2.3进行了测试:

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

当我第一次运行它时,我在我的SQL记录器中看到了实际的查询。

当我第二次、第三次等运行它时,我的SQL记录器中就什么也看不到了。

我的结论是它正常工作。

我猜你要么没有配置结果缓存,要么配置了非永久性结果缓存(比如ArrayCache),要么这是Doctrine 2.2.2的一个bug(尽管我在jira上找不到任何相关信息)。

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

PPS:在Doctrine 2.0之后的某个地方(我想是2.2),结果缓存发生了变化。现在缓存的是SQL结果而不是已经处理好的结果(每次运行都需要处理)。如果你想缓存已经处理好的结果,你需要使用hydration-cache(但请注意,这些结果不会合并到EntityManager中)。


我的解决方案是创建自己的“结果缓存”。这就是其他问题所涉及的内容。 - nwalke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接