php - 如何通过引用文档查询嵌入文档?

标签 php doctrine-orm mongodb

我正在使用 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),我尝试了几种不同的方法来实现这一点,一种方法有效但有点老套。

第一种方式,行不通:

$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 如何让你直接返回一个嵌入式文档。

最佳答案

如果您使用 ReferenceManyReferenceOne,您不能通过任何引用文档字段查询,引用文档 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),您应该使用 embedOneembedMany 而不是引用。

关于php - 如何通过引用文档查询嵌入文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5347788/

相关文章:

php - 使用 PHP 将 MySQL 数据库转换为 .TXT

Symfony 不可编辑的表单域

doctrine - 在带有 DQL 的 WHERE 子句中使用 DATE() 函数

java - Spring Data MongoDB 4.0 事务支持

php - 它不会总结,我的代码有什么问题?

php - 不确定 mysql 中的文本字段应该有多长

symfony - Symfony 2 中相关实体的急切加载

linux - 我如何加入 MongoDB 中的字段?

mongodb - ReactiveMongo:使用游标[BSONObjectID]查找查询

php - 自动安排和执行 PHP 脚本