Symfony 原则ODM通过Id获取混合类型

Symfony 原则ODM通过Id获取混合类型,symfony,doctrine,doctrine-odm,Symfony,Doctrine,Doctrine Odm,我有一个混合类型的集合,如下所定义: 相册 我想用给定的Id检索该集合的任何对象 差不多 $object = $dm->find(['Article','Album'], $id); 我不能使用它,因为find需要一个文档名。它将是: $article = $dm->find('Article', $id); $album = $dm->find('Album', $id); 我试图创建自己的查询,但它总是返回null $qb = $dm->createQueryBu

我有一个混合类型的集合,如下所定义:

相册

我想用给定的Id检索该集合的任何对象

差不多

$object = $dm->find(['Article','Album'], $id);
我不能使用它,因为find需要一个文档名。它将是:

$article = $dm->find('Article', $id);
$album = $dm->find('Album', $id);
我试图创建自己的查询,但它总是返回null

$qb = $dm->createQueryBuilder(['Article', 'Album']);
$qb
   ->elemMatch(['id' => $id])
;
$result  = $qb->getQuery()->execute();

你有什么想法吗?

最简单的解决方案是引入一个父类,
Article
Album
都从中扩展。因此,您还可以指定一次
@DiscriminatorMap

/**
 * @Document(collection="my_documents")
 * @DiscriminatorField(fieldName="type")
 * @DiscriminatorMap({"article"="Article", "album"="Album"})
 * @InheritanceType("SINGLE_COLLECTION")
 */
abstract class Item {  }

/**
 * @Document()
 */
class Album extends Item { /* ... */ }

/**
 * @Document()
 */
class Article extends Item { /* ... */ }
现在,只要您想同时查找这两种类型的文档,就可以使用:

$item = $dm->find(Item::class, $id);
根据数据库中存储的内容,
$item
将作为
文章或
相册返回。此外,您还可以对存储库执行相同的操作:

$items = $dm->getRepository(Item::class)->findAll(); 

没有继承的想法吗?理论上,您可以自己从MongoDB中获取数据(
DocumentManager::getDocumentCollection
),然后手动调用Hydroor,但这似乎是一种过分的做法
$item = $dm->find(Item::class, $id);
$items = $dm->getRepository(Item::class)->findAll();