LEFT JOIN ... WITH条件的Doctrine结果缓存错误

时间:2012-02-17 15:48:53

标签: doctrine symfony left-join dql

在我需要在此处发布问题之前,我倾向于找到答案,但今天我似乎无法找出问题所在。

我们在Symfony 2应用程序中使用Doctrine 2.1.2,在存储库中我们有两种使用几乎相同查询的方法。 方法A和方法B之间的唯一区别是添加到JOIN的条件对两个查询都是通用的。

问题是Doctrine似乎对两个查询使用相同的结果缓存。 当我们调用方法A时,方法B使用A中的缓存,反之亦然。

我一直在使用expireResultCache(true)和useResultCache(false),但无济于事。

这是查询的样子:

-- method A

SELECT DISTINCT a, b, c FROM MyBundle:ObjectA a INDEX BY a.id
LEFT JOIN a.fkObjectB b
LEFT JOIN a.fkObjectC c

-- method B
SELECT DISTINCT a, b, c FROM MyBundle:ObjectA a INDEX BY a.id
LEFT JOIN a.fkObjectB b WITH b.some_field IS NULL
LEFT JOIN a.fkObjectC c

当我使用getSQL()时,我发现它们会按预期产生不同的查询。生成的查询在数据库中独立运行时会产生不同的结果。

这让我相信它可能是一个烦人的结果缓存错误,其中Doctrine不缓存JOIN的条件,而只缓存表名。

这是一个错误,还是我能做些什么?

编辑仍然在Doctrine 2.1.6中发生。

2 个答案:

答案 0 :(得分:0)

我认为您所遇到的问题已在Doctrine 2.2中修复。我有与结果缓存相关的类似问题,这里是my question&answers

答案 1 :(得分:0)

为了扩展michel v's comment,Doctrine 2通过identity map pattern两次获取相同的对象实例。

通话:

EntityManager#clear()

清除身份映射并强制EntityManager从数据库中获取对象的新副本。