如何在 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 中查询多层链接表的主要内容,如果未能解决你的问题,请参考以下文章