2014-11-21 76 views
0

我想用查詢生成器編寫一個複雜的查詢,我需要幫助(我是一個完整的noob在連接查詢)情況是這樣的,我有一個國家的表, country_id關係以及帶有hotel_id關係的促銷活動。使用查詢生成器複雜的連接查詢

所以酒店有國家,而且促銷有酒店。現在我需要找到屬於一組國家的所有促銷活動。爲此,我需要檢查他們所屬的酒店是否在這些國家。

無論如何,有人可以幫助我建立與查詢生成器的查詢?我也會接受mysql查詢。

+0

您需要屬於集合中的所有國家或集合中任何國家/地區的所有國家/地區的促銷活動嗎? – Quassnoi 2014-11-21 16:09:45

回答

1

假設你已經設置你的關係在你的實體@OneToMany@ManyToOne,你已經填充所需主義集合或國家編號的陣列到$countries

$result = $this->getDoctrine()->getManager()->createQueryBuilder() 
    ->select('c, h, p') 
    ->from('AcmeBundle:Promotion', 'p') 
    ->innerJoin('p.hotels', 'h') 
    ->innerJoin('h.country', 'c') 
    ->where('c IN (:countries)') 
    ->setParameter('countries', $countries) 
    ->getQuery() 
    ->getResult(); 

產生的SQL最終會被類似的東西來:

SELECT c.*, h.*, p.* FROM promotions p 
    INNER JOIN hotels h ON p.hotel_id = h.id 
    INNER JOIN country c ON h.country_id = c.id 
    WHERE c.id IN (?) 

注意這個查詢不會不恰當地定義你的學說實體合作。既然你沒有提供你的實體配置,我不得不用假設回答你的問題。 Here's some more information on setting up your Database with Doctrine,特別是Entity Relationship mapping

+0

我的關係是多方合一的方式。所以酒店與國家有多對一的關係,促銷活動與酒店有多對一的關係,但我沒有其他方式的關係。因此,酒店不知道他們的促銷活動是誰,並且國家不知道有哪些酒店, – 2014-11-22 16:29:26

+0

@JoeYahchouchi您需要讓他們雙向的。 – sjagr 2014-11-22 19:59:05

+0

我現在很聰明,並意識到你的答案是現貨;) – 2016-02-17 09:40:47