我遵循了本教程,一切正常: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
运算符有一个数组。所以我无法想象出现了什么问题?
编辑/更多信息:
所以我发现了一点。如果我改变两个实体'映射到ReferenceMany
我可以加载$post->getUsers()
,但不能加载$user->getPosts()
。请注意,User
实体是拥有方。但为什么???
答案 0 :(得分:0)
这并没有完全回答你的问题,但是是一些常见的调试建议。
我的经验中的学说有点糟糕(我们不得不删除它,因为它引入的方式太慢而且性能不佳的查询)。但是,为了诊断这个问题,我想你需要启用常规查询日志记录来查找发送的实际查询,或者使用wireshark或mongosniff来捕获它。
鉴于错误,它可能是查询中的任何$ in子句,而不仅仅是您找到的那个。此外,由于它完全由Doctrine管理,如果它在查询中没有生成另一个错误的$ in子句,它有可能会覆盖你在稍后发现的$ in子句。