Doctrine MongoDb - ReferenceMany loading说不能规范化查询

时间:2014-08-05 20:20:46

标签: php mongodb doctrine-orm doctrine

我遵循了本教程,一切正常:http://doctrine-mongodb-odm.readthedocs.org/en/latest/reference/bidirectional-references.html

但是我改变了存储引用的位置。在上面的示例中,帖子包含一个用户。但我改变了它,所以用户将获得一系列帖子。保存工作正常。

但是如果我加载一个用户并说$user->getPosts()我得到零结果。如果我查看mongodb,则不保存任何引用。所以我将User中的注释更改为/** @ODM\ReferenceMany(targetDocument="BlogPost", cascade="all") */(注意级联="所有"此处已更改)。现在引用被保存到mongodb。

如果我再次加载用户并说$user->getPosts(),我会收到以下错误消息:

Uncaught exception 'MongoCursorException' with message 'localhost:27017: Can't canonicalize query: BadValue $in needs an array' in

我在Doctrine\ODM\MongoDB\Persisters\DocumentPersister运算符构建的方法loadReferenceManyCollectionOwningSide()中调试到in(第697行)。不幸的是,你可以在屏幕截图中看到,一切似乎都很好。 in运算符有一个数组。所以我无法想象出现了什么问题? enter image description here

编辑/更多信息: 所以我发现了一点。如果我改变两个实体'映射到ReferenceMany我可以加载$post->getUsers(),但不能加载$user->getPosts()。请注意,User实体是拥有方。但为什么???

1 个答案:

答案 0 :(得分:0)

这并没有完全回答你的问题,但是是一些常见的调试建议。

我的经验中的学说有点糟糕(我们不得不删除它,因为它引入的方式太慢而且性能不佳的查询)。但是,为了诊断这个问题,我想你需要启用常规查询日志记录来查找发送的实际查询,或者使用wireshark或mongosniff来捕获它。

鉴于错误,它可能是查询中的任何$ in子句,而不仅仅是您找到的那个。此外,由于它完全由Doctrine管理,如果它在查询中没有生成另一个错误的$ in子句,它有可能会覆盖你在稍后发现的$ in子句。