加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读