2012-06-18 5 views
11

こんにちは私はsymfony2アプリケーションに3つのDoctrine2エンティティを持っています:バンドルの2つ( "Promo"と "PromoPeriod")Acme:PromoBundle; 1つ(「Shop」)をバンドルAcme:ShopBundleに入れます。 関係は: プロモーション - プロモーション期間:多対です。 PromoPeriod - Shop:1対多。次のように実体「プロモ」のリポジトリに 異なるSymfony2バンドルの複数のエンティティを選択したDoctrine2クエリ

は、私はすべてのプロモーションを取得しようとお店:p.periodはプロモインスタンスpとPromoPeriod期間との関係を次のとおりです。

return $this->getEntityManager() 
     ->createQuery("SELECT p, s 
      FROM AcmePromoBundle:Promo p JOIN p.period pp JOIN pp.shops s") 
      ->getResult(); 

; pp.shopsはPromoPeriod ppとショップの関係です。 次のエラーが返されます。

An exception has been thrown during the rendering of a template 
("The parent object of entity result with alias 's' was not found. 
The parent alias is 'pp'.") 

だから、私は、それが別のバンドルに位置しているのでDoctrineは、(ショップエンティティである)、「S」のタイプを理解することはできないと主張しました。したがって、私はINSTANCE OF句を追加しようとしました:

SELECT p, s 
FROM AcmePromoBundle:Promo p JOIN p.period pp JOIN pp.shops s 
WHERE s INSTANCE OF AcmeShopBundle:Shop 

もう一度何もしません。おそらく、これは問題を解決する方法ではないでしょう。

+0

FQCNを使用するとどうなりますか? –

+0

FQCNの使用方法は? Doctrine2ではSQL問合せが異なる方法で作成されていることに注意してください.Decrine2はORMであるためです。 – JeanValjean

+0

Mmm、mmm、FQCN =完全修飾クラス名、エンティティを選択する方法は、Doctrine2エイリアス(AcmePromoBundle)を使用しています。このエイリアスは、クエリーの作成中にエンティティ名をショートカットするために使用され、実際のネームスペースに直接マッピングされます。私はFQCNを使用して、エイリアシングの問題であるかどうかを確認するよう依頼しました。 FQCNを選択すると、アプリケーションのどの部分でも機能するはずです。 –

答えて

23

は、あなたはすなわち、参加フェッチやっているので、

SELECT p, pp, s 
FROM AcmePromoBundle:Promo p 
JOIN p.period pp 
JOIN pp.shops s 

のように、3つのエンティティを選択する必要があります教義は(ここでプロモ(S))、クエリの根のエンティティを返し、それを追加の選択エンティティで水和させる。 doctrineに店舗をロードするように言うと、それは期間から来ていますが、期間を選択しないように...あなたがしたいことをすることはできません。 ここでは、SQLクエリがうまく行く、それはdoctrineが例外をスローするオブジェクトを水和しようとするときです。

関連ドキュメントの参照http://docs.doctrine-project.org/en/latest/reference/dql-doctrine-query-language.html#joins

+0

まあ、そうです、エラーは返されません!しかし、 'pp'と' s'オブジェクトが選択されているにもかかわらず、 'p'オブジェクトだけが返されます!それは正常ではないようです! – JeanValjean

+1

しかし、ppとsはpで利用できるようになりました – phonixor

関連する問題