11

こんにちは、私の Symfony2 アプリケーションには 3 つの Doctrine2 エンティティがあります。バンドル Acme:ShopBundle 内の 1 つ (「ショップ」)。関係は次のとおりです。 Promo - PromoPeriod: Many-to-One。PromoPeriod - ショップ:一対多

エンティティ「プロモーション」のリポジトリで、次のようにすべてのプロモーションとショップを取得しようとします。

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

p.period は、Promo インスタンス p と PromoPeriod 期間の間の関係です。pp.shops は、PromoPeriod pp と Shops の間の関係です。次のエラーが返されます。

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" (Shop エンティティ) のタイプを理解できないと主張しました。したがって、INSTANCE OF 句を追加しようとしました。

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

そしてまた何もありません。おそらく、これは問題を解決する方法ではありません。

何か案が?

4

1 に答える 1

23

次のように、3つのエンティティを選択する必要があります

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

フェッチ結合を実行しています。つまり、doctrineはクエリのルートのエンティティ(ここではPromo(s))を返し、追加のselectエンティティでハイドレイトします。ですから、教義に店をロードするように指示すると、それは期間から「来ます」が、期間を選択しないと...彼はあなたが求めていることを行うことができません。ここでは、SQLクエリは正常に機能します。ドクトリンがオブジェクトをハイドレイトしようとすると、例外がスローされます。

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

于 2012-07-06T00:36:32.087 に答える