我正在使用Doctrine ODM,并且无法通过引用文档查询嵌入式文档。
考虑以下文件:
<?php
/** @Document */
class TopCategory
{
/** EmbedMany(targetDocument="SubCategory") */
private $subCategories;
}
/** @EmbeddedDocument */
class SubCategory
{
/** ReferenceMany(targetDocument="Product") */
private $products;
}
/** @Document */
class Product
{
/** @String */
private $name;
}
现在我想知道如何按产品找到TopCategory(或SubCategory),我尝试了几种不同的方法来实现这一点,一种方法有效,但有点hackish。
第一种方式,不起作用:
$category = $dm->createQueryBuilder('TopCategory')
->field('subCategories.products')->includesReferenceTo($someProduct)
->getQuery()->execute();
// ... gives Doctrine\ODM\MongoDB\MongoDBException: No mapping found for field 'subCategories.products' in class 'TopCategory'.'
第二种方式,不起作用:
$category = $dm->createQueryBuilder('SubCategory')
->field('products')->includesReferenceTo($someProduct)
->getQuery()->execute();
// ... returns null
第三,工作解决方法:
$category = $dm->createQueryBuilder('SubCategory')
->field('products.$id')->equals(new \MongoId($someProduct->getId()))
->getQuery()->execute();
// .. works, but seems hackish
我正在使用GitHub和MognoDB v1.8.0中的最新版本 这有什么用呢?
注意:有趣的是Doctrine ODM如何让您直接返回嵌入式文档。
答案 0 :(得分:7)
如果您使用ReferenceMany
或ReferenceOne
,则无法通过任何参考文档字段进行查询,但参考文档ID除外,因为在mongodb参考文档中存储如下:
{
$id: 'id',
$db: 'referenced_doc_db_name',
$ref: 'referenced_doc_collection_name'
}
ReferenceOne,ReferenceMany在驱动程序内部完成,如果需要加载一些具有引用驱动程序的文档,则发送其他请求以加载引用的文档。
所以,以下查询不是hackish;):
$category = $dm->createQueryBuilder('SubCategory')
->field('products.$id')->equals(new \MongoId($someProduct->getId()))
->getQuery()->execute();
// .. works, but seems hackish
如果您需要查询某些参考字段(ID除外),则应使用embedOne
或embedMany
代替参考。