如何在 symfony 中查询多层链接表

Posted

技术标签:

【中文标题】如何在 symfony 中查询多层链接表【英文标题】:how to issue query for multi layers linked tables in symfony 【发布时间】:2016-10-06 21:49:56 【问题描述】:

我有一个关于如何为多层链接表发出 createQueryBuilder 的问题。

我有一个表“City”,其中一列“country_id”链接到表“Country”。 “Country”表有一个“zone_id”列链接到“Zone”表。

如何为 SQL 生成 QueryBuilder,如下所示?

Select * from City
LEFT JOIN Country AS c ON City.country_id=c.id
LEFT JOIN Zone AS z ON c.zone_id=z.id
WHERE z.id In (1,2,3,4)

在我的城市实体和国家实体中,我做了ManytoOne链接关系。

在 CityEntity.php

 /**
 * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Country",cascade="persist")
 * @ORM\JoinColumn(nullable=false)
 */
 private $country;

在 CountryEntity.php 中

/**
 * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Zone",cascade="persist")
 * @ORM\JoinColumn(nullable=false)
 */
private $zone;

【问题讨论】:

【参考方案1】:

这应该有效,或者非常接近它。我现在无法对其进行语法检查。

$qb = $this->getEntityManager()->createQueryBuilder();

$results = $qb->select('c, co, z')
    ->from('AppBundle:City', 'c')
    ->leftJoin('c.country', 'co')
    ->leftJoin('co.zone', 'z', 'WITH', $qb->expr()->in('z.id', [1,2,3,4]))
    ->getQuery()
    ->getResult();

请注意,这将返回区域不在区域 id 数组中的国家/地区。如果您的意图是按区域限制,则应该使用 join 而不是 leftJoin。在这种情况下,查询将如下所示:

    $results = $qb->select('c, co, z')
        ->from('AppBundle:City', 'c')
        ->join('c.country', 'co')
        ->join('co.zone', 'z')
        ->where($qb->expr()->in('z.id', [1,2,3,4]))
        ->getQuery()
        ->getResult();

【讨论】:

谢谢。这样可行。我仍然对这个问题有疑问。我尝试使用如下代码来避免使用“加入”。但它不起作用。 $results->andWhere("c.country.zone IN [1,2,3,4]")但是如果我用同样的方法对待国家。它有效,例如。 $results->andWhere("c.country IN [1,2,3,4]")你知道是否可以使用obj1.obj2.obj3的样式吗? 你肯定需要加入,不能使用obj1.obj2.obj3。我猜当你使用 c.country 时,它只是限制国家 ID,而不是区域 ID。加入没有什么问题,如果它很慢并且您有一个大数据集,请查看您的索引。 非常感谢理查德。

以上是关于如何在 symfony 中查询多层链接表的主要内容,如果未能解决你的问题,请参考以下文章

SQL多表链接查询、嵌入SELECT语句的子查询技术

在自联接表中的两个外键之间进行搜索的查询

如何将 SQL 查询与另一个表链接?

如何查询访问权限并将其链接到excel中的工作表

Python 图_系列之基于<链接表;实现无向图最短路径搜索

Symfony,上一个和下一个链接