我正在使用 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 如何让你直接返回一个嵌入式文档。
最佳答案
如果您使用 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
而不是引用。
关于php - 如何通过引用文档查询嵌入文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5347788/