Php 如何通过引用文档查询嵌入文档?
我使用的是Doctrine ODM,通过引用文档查询嵌入文档时遇到问题 考虑以下文件:Php 如何通过引用文档查询嵌入文档?,php,doctrine-orm,mongodb,Php,Doctrine Orm,Mongodb,我使用的是Doctrine ODM,通过引用文档查询嵌入文档时遇到问题 考虑以下文件: <?php /** @Document */ class TopCategory { /** EmbedMany(targetDocument="SubCategory") */ private $subCategories; } /** @EmbeddedDocument */ class SubCategory { /** ReferenceMany(targe
<?php
/** @Document */
class TopCategory
{
/** EmbedMany(targetDocument="SubCategory") */
private $subCategories;
}
/** @EmbeddedDocument */
class SubCategory
{
/** ReferenceMany(targetDocument="Product") */
private $products;
}
/** @Document */
class Product
{
/** @String */
private $name;
}
第二种方法不起作用:
$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在驱动程序中内部完成,如果需要加载某些包含引用的文档,驱动程序将发送其他请求以加载引用的文档
因此,下面的查询并不粗俗;):
如果您需要查询某些参考字段(id除外),您应该使用
embedOne
或embedMany
而不是reference。除了ref-id之外,是否还有其他方法可以查询任何参考字段?在我的例子中,我需要像$qb->field('permissions.group.id')->equals($id)这样的东西代码>权限是许多字段和组a引用字段的一部分
$category = $dm->createQueryBuilder('SubCategory')
->field('products.$id')->equals(new \MongoId($someProduct->getId()))
->getQuery()->execute();
// .. works, but seems hackish