Doctrine ODM Get By Id 混合类型
Doctrine ODM Get By Id with mixed type
我有一个像这里定义的混合类型的集合: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);
我尝试创建自己的查询,但它总是 return 为空。
$qb = $dm->createQueryBuilder(['Article', 'Album']);
$qb
->elemMatch(['id' => $id])
;
$result = $qb->getQuery()->execute();
你有什么想法吗?
最简单的解决方案是引入父级 class,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
将作为 Article
或 Album
返回。此外,您可以对存储库执行相同的操作:
$items = $dm->getRepository(Item::class)->findAll();
我有一个像这里定义的混合类型的集合: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);
我尝试创建自己的查询,但它总是 return 为空。
$qb = $dm->createQueryBuilder(['Article', 'Album']);
$qb
->elemMatch(['id' => $id])
;
$result = $qb->getQuery()->execute();
你有什么想法吗?
最简单的解决方案是引入父级 class,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
将作为 Article
或 Album
返回。此外,您可以对存储库执行相同的操作:
$items = $dm->getRepository(Item::class)->findAll();