【问题标题】:Doctrine result cache bug with LEFT JOIN ... WITH condition带有 LEFT JOIN ... WITH 条件的 Doctrine 结果缓存错误
【发布时间】:2012-02-17 15:48:53
【问题描述】:

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

我们在 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 中发生。

【问题讨论】:

    标签: doctrine symfony left-join dql


    【解决方案1】:

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

    【讨论】:

    • 以防万一有人偶然发现这个老问题:问题出在椅子和键盘之间。我们没有考虑到托管实体的数组集合属性将保持不变并且不会被连续查询更新。
    【解决方案2】:

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

    调用:

    EntityManager#clear()
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-20
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 2012-06-13
      • 2015-02-24
      相关资源
      最近更新 更多