2012-02-06 101 views
1

據我所知,doctrine dql不允許子查詢在一個連接內。Symfony2,Doctrine DQL,子查詢,使用條件從另一個表中獲取值

我有一個表和一個trasnlation表。這種關係是一對多的關係。一個記錄有很多翻譯。

爲了從translatiosn表我做的SELECT子句中子查詢得到正確的翻譯行:

 $query = $this->getDoctrine()->getEntityManager() 
      ->createQuery(' 
       SELECT w.id, w.pastid, w.name, w.jsonParameters as params, m.id as milestone_id, m.name as milestone_name, 
       m.slug as milestone_slug, m.startdate as milestone_start, m.enddate as milestone_end, 
       w.expand as expand, w.backgroundcolor as background, w.colorschema as colorschema, w.headline as headline, w.subheadline as subheadline, w.text as text, w.expandheight as expandheight, 
       w.url as url, w.created as created, w.updated as updated, wt.name as wtname, ws.weight as width, ws.height as height 
       , (SELECT t.headline FROM AdminBundle:widgetTranslation t WHERE t.widget = w.id and t.locale = :published) AS headline_trans 
       , (SELECT t2.subheadline FROM AdminBundle:widgetTranslation t2 WHERE t2.widget = w.id and t2.locale = :published) AS subheadline_trans 
       , (SELECT t3.text FROM AdminBundle:widgetTranslation t3 WHERE t3.widget = w.id and t3.locale = :published) AS text_trans 
       FROM AdminBundle:Widget w 
       JOIN w.milestone m 
       JOIN w.widgetType wt 
       JOIN w.widgetShape ws 
       WHERE w.published = 1 
       ORDER BY m.order, w.order 
      ')->setParameter('published', $currentLocale); 

     $result = $query->getArrayResult(); 

這個查詢做了工作,但蔭擔心的表現,有沒有更好的查詢來做到這一點?

回答

-1

首先,我需要澄清一點點。 有什麼真的不對在你的問題。 您正在使用ORM,對吧?但是你在談論桌子。 ORM不關心你的表是如何組織或鏈接在一起的。它只關乎對象之間的關係。

但是,如果您擔心性能問題,最好的做法是使用任何SQL查詢來做到這一點,它就是EXPLAIN它。

由於您使用的是Symfony 2.0,因此您可以使用profiler(可在dev env中訪問)查看您的查詢的EXPLAIN結果。

確保使用的是索引,並且查找的行數不會太高。

根據您的結果,您可能需要使用其他策略來獲取您的翻譯或在原生SQL中重新編寫查詢以提供更大的靈活性。

+0

數據庫還有表... – Bart 2012-11-02 14:10:12

+0

@Bart,等等是什麼?如果你使用ORM方法,你不應該擔心「表」或「數據庫」這個詞彙與ORM無關,ORM的主要目的是抽象持久層並提供一個對象映射,可能來自關係數據庫,xml文檔,NoSQL服務器等。您不能使用混合解決方案的50%關係/ 50%對象,您必須在其中一個或另一個之間進行選擇。既可以使用Native SQL查詢,也可以考慮對象之間的關係,而不是如何在持久層中表示它們。 – 2012-11-05 12:03:08

+0

無論如何。你可以稱它們爲「表」(db術語)或「集合」或任何你喜歡的東西,但是它們之間的關係將保持不變,在這種情況下是一對多關係。然而,我不同意從ORM嚴格分離SQL。你改變底層系統多少次?大多數情況下永遠不會使用ORM通常在訪問屬性等時更方便,但是,編寫一個(本地)SQL查詢有時可以將軟件的其他部分的性能提高几個數量級。最終用戶不會在乎它是否是ORM/SQL。 – Bart 2012-11-05 17:28:25