2011-03-18 129 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