使用混合类型的Doctrine ODM Get By Id

时间:2017-08-17 10:13:30

标签: symfony doctrine doctrine-odm

我有一个类似于此处定义的混合类型的集合:http://www.doctrine-project.org/2010/07/20/mixing-types-of-documents.html

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

相册

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

我想用给定的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();

你有什么想法吗?

1 个答案:

答案 0 :(得分:1)

最简单的解决方案是引入一个父类,ArticleAlbum都可以扩展。多亏了你,你也可以指定@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将以ArticleAlbum的形式返回。此外,您可以使用存储库执行相同的操作:

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