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();

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

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

有人建议我这样做但这违背了结果缓存的目的。

4

1 回答 1

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 中的错误(尽管我在吉拉)。

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

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

于 2012-11-15T09:13:50.563 回答