2017-08-17 55 views
0

我有混合型的集合等被定義在這裏:http://www.doctrine-project.org/2010/07/20/mixing-types-of-documents.html主義ODM獲得通過標識與混合型

/** 
* @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); 

我不能使用,因爲發現需要文檔名稱。它會是:

$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

最簡單的解決方案是引入一個父類,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(); 
+0

任何不帶繼承的想法? – goto

+0

理論上你可以自己從MongoDB獲取數據('DocumentManager :: getDocumentCollection'),然後手動調用Hydrator,但這似乎是一個過度的 – malarzm