php – 如何通过引用的文档查询嵌入的文档?
发布时间:2020-12-13 21:40:42 所属栏目:PHP教程 来源:网络整理
导读:我正在使用Doctrine ODM,并且无法通过引用文档查询嵌入式文档. 考虑以下文件: ?php/** @Document */class TopCategory { /** EmbedMany(targetDocument="SubCategory") */ private $subCategories;}/** @EmbeddedDocument */class SubCategory { /** Refere
我正在使用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 DoctrineODMMongoDBMongoDBException: 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如何让您直接返回嵌入式文档. 解决方法
如果您使用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而不是reference. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |