2012-01-07 50 views
1

查詢(我不知道如何使標題更加清晰 - 隨意編輯)簡化在Symfony2中

我有葡萄酒酒廠兩個表。每個酒都有一個酒莊分配給它。
如果我要生產出相應的酒莊所有葡萄酒的名單,我可以這樣做:

$entities = $em->getRepository('MyBundle:Wine')->findAll(); 

{% for entity in entities %} 
    {{ entity.winery.name }} {{ entity.name }} <br /> 
{% endfor %} 

這種解決方案的問題在於,是由一個額外的查詢爲每一個我想要預防的酒莊。

我嘗試了​​中使用的技術,但是我無法使它工作(它只適用於單個結果嗎?)。

通常使用SQL,我只是簡單地做一個LEFT JOIN,但我無法弄清楚如何在Doctrine2中完成這個任務。

$qb = $this->createQueryBuilder('w', 'wnr'); 
$qb->leftJoin('w.winery', 'wnr'); 
$qb->orderBy('w.name', 'ASC'); 

$qb->getQuery()->getResult(); 

???

我會很感激任何幫助!

+0

SQL,DQL,自己的方法。它全部列在您鏈接的手冊頁面中。 – hakre 2012-01-07 19:31:32

+0

@hakre:但我以後如何訪問它?如果我像這樣左連接,我無法訪問連接的屬性。 – Czechnology 2012-01-07 19:33:49

+0

這取決於你試圖達到的目標。在使用ORM時,通常不想使用SQL。因此,請稍微介紹一下SQL,看看是否可以通過DQL解決您的問題。 DQL將返回對象。 – hakre 2012-01-07 19:35:09

回答

3

您是否在DQL查詢中選擇了Winery?

$entities = $em->getRepository('MyBundle:Wine') 
    ->createQueryBuilder('w') 
    ->select('w, wnr') 
    ->leftJoin('w.winery', 'wnr'); 
    ->getQuery() 
    ->getResult(); 
+0

我仍然有同樣的問題 - 以後如何訪問它?因爲如果我嘗試訪問酒的屬性'wnr',symfony抱怨說沒有這樣的方法。這是可以理解的,但這是否意味着我必須修改實體本身? – Czechnology 2012-01-07 22:28:59

+0

@Czechnology:你不使用該屬性的getter方法嗎? – hakre 2012-01-07 22:32:31

+0

好吧,我想我終於明白了,並且或多或少地理解了它。在SQL和DQL之間,我的大腦仍然有點卡住了。當我使用樹枝中的普通'winery'屬性(這是標準的getter方法)時,只需一個查詢就可以很好地工作。謝謝你的幫助! – Czechnology 2012-01-07 22:39:16