【问题标题】:Complex join query with query builder使用查询生成器的复杂连接查询
【发布时间】:2014-11-21 16:06:47
【问题描述】:

我正在尝试使用查询生成器编写一个复杂的查询,我需要帮助(我是一个完整的连接查询菜鸟)情况是这样的,我有一个国家表,一个与 country_id 关系的酒店表,以及与hotel_id 关系。

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

无论如何,有人可以帮助我使用查询生成器构建查询吗?我也会接受 mysql 查询。

【问题讨论】:

  • 您需要属于一组中所有国家或一组中任何国家的促销活动?

标签: mysql symfony doctrine-orm query-builder


【解决方案1】:

假设您已在实体中建立了与 @OneToMany@ManyToOne 的关系,并且您已将所需的 Doctrine 集合或国家 ID 数组填充到 $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 (?)

请注意,如果不适当地定义您的 Doctrine 实体,此查询将无法工作。由于您没有提供您的实体配置,因此我不得不用假设来回答您的问题。 Here's some more information on setting up your Database with Doctrine,特别是Entity Relationship mapping

【讨论】:

  • 我的关系是一对一的。所以酒店和国家有多对一的关系,促销和酒店有多对一的关系,但我没有相反的关系。所以酒店不知道他们的促销活动是谁,国家也不知道有什么酒店,
  • @JoeYahchouchi 那么你需要让它们成为双向的。
  • 我现在更聪明了,意识到你的答案是正确的;)
猜你喜欢
  • 2015-12-21
  • 2014-01-13
  • 2018-06-23
  • 2011-10-21
  • 2019-01-18
  • 2015-05-09
  • 2010-11-02
  • 1970-01-01
  • 2016-11-16
相关资源
最近更新 更多