2017-08-17 1 views
0

でIDによって取得: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で、ArticleまたはAlbumのいずれかに戻ります。さらに、リポジトリでも同じことができます。

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

継承のないアイデアはありますか? – goto

+0

理論的には、MongoDBから独自にデータを取得して( 'DocumentManager :: getDocumentCollection')、手動でHydratorを呼び出すことができますが、それは過度の – malarzm

関連する問題