2011-03-18 104 views
3

我正在使用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(或子类别),我已经尝试了几种不同的方式来实现这一目标,一个方法有效,但有点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如何让你直接返回嵌入式文档。

回答

7

如果您在使用ReferenceManyReferenceOne您可以通过任何参考文献场MongoDB的参考文档中查询不到,除了参考文件ID,因为存储是这样的:

{ 
    $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查询),你应该使用embedOneembedMany,而不是参考。

+0

请问是否有任何解决方法查询任何参考字段期望ref ID?在我的情况下,我需要像'$ qb-> field('permissions.group.id') - > equals($ id);'权限是一些embedMany字段和组参考一 – 2015-04-19 00:21:45