2012-02-22 10 views
0

http://symfony.com/doc/2.0/book/doctrine.html#fetching-related-objectsフェッチ関連オブジェクトsymfonyの2本で

は、それは非常に簡単です:

public function showAction($id) 
{ 
$product = $this->getDoctrine() 
    ->getRepository('AcmeStoreBundle:Product') 
    ->find($id); 

$categoryName = $product->getCategory()->getName(); 

// ... 
} 

しかし、私はすべての製品を取得したい場合はどのようなカテゴリ情報は各プロジェクトに自動的に結合されますか?

ありがとうございました!

答えて

1

これは、トリックを行います:

$products = $this->getDoctrine()->getRepository('AcmeStoreBundle:Product')->findAll(); 

は、しかし、あなたが製品上のgetCategory SQLクエリを実行するたびに、パフォーマンスにつながる可能性がトリガされますこれは、次のようなもののように見えるかもしれません問題。

自分が本当にやりたいことは、自分自身をProductManagerサービスにして、商品とカテゴリに参加する明示的なクエリを書くことです。したがって、生成されるSQLクエリは1つだけです。 Doctrine 2のマニュアルにはたくさんの例があります。

http://docs.doctrine-project.org/projects/doctrine-orm/en/2.1/reference/query-builder.html

+0

私はDoctrineがより使いやすいと思っています...とにかくありがとう! – mennanov

0

商品を繰り返して、そこからカテゴリを取得することができます。リレーションに対するフェッチモードを調整すると、実行されるクエリの量を減らすのに役立ちます。

ただし、必要なものを得るためにカスタムDQLクエリを作成することもできます。

SELECT p, c 
FROM AcmeStoreBundle:Product p 
INNER JOIN p.category c 
+0

SQLクエリ(DQL ...)を記述することなく行うことはできますか?私は、例では、余分なコードなしで同じことをしたいということを意味します。 そして、それが可能でないなら、あなたはそれのための完全なPHPコードを提供できますか?また、 "active = 1 AND foo = 'bar'"のようなフィルタオプションをいくつか適用したいと思います。それらを追加するには? thx – mennanov

+0

フィルタを使用する場合は、クエリを記述する必要があります。コードをきれいに保つために、リポジトリを設定したいと思うかもしれません。詳細はhttp://mackstar.com/blog/2010/10/04/using-repositories-doctrine-2をご覧ください。 –

+0

findBy()はフィルタリングに役立ちます。しかし、現実には、あなたが霧の基本的なものを越えるとすぐに、あなた自身のクエリを書くことになるでしょう。 Doctrineのクエリビルダを使用すると、raw SQLを使用するよりもずっと簡単になります。 – Cerad