使用查询生成器复杂的连接查询

问题描述:

我想用查询生成器编写一个复杂的查询,我需要帮助(我是一个完整的noob在连接查询)情况是这样的,我有一个国家的表, country_id关系以及带有hotel_id关系的促销活动。使用查询生成器复杂的连接查询

所以酒店有国家,而且促销有酒店。现在我需要找到属于一组国家的所有促销活动。为此,我需要检查他们所属的酒店是否在这些国家。

无论如何,有人可以帮助我建立与查询生成器的查询?我也会接受mysql查询。

+0

您需要属于集合中的所有国家或集合中任何国家/地区的所有国家/地区的促销活动吗? – Quassnoi 2014-11-21 16:09:45

假设你已经设置你的关系在你的实体@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