3

每个人。我有 2 个实体 City 和 POI。映射如下所示:

class City {
/**
 * @ORM\ManyToMany(targetEntity="POI", mappedBy="cities")
 * @ORM\OrderBy({"position" = "ASC"})
 */
protected $pois;

class POI {
/**
 * @ORM\ManyToMany(targetEntity="City", inversedBy="pois")
 * @ORM\JoinTable(name="poi_cities")
 */
protected $cities;

我想使用 QueryBuilder 获取与某个城市至少有 1 个关联的所有 POI。我可能应该使用 exists() 函数,但我不知道怎么做。

4

2 回答 2

7

您必须Left join检查它们是否cities为空。

$qb->select('p', 'c')
   ->from('AcmeDemoBundle:POI', 'p')
   ->leftJoin('p.cities', 'c')
   ->where('c IS NOT NULL');

我没有测试过它,但我希望它能给你一个大致的方向。QueryBuilder你可以从这里阅读更多关于 的信息。

于 2011-09-26T10:08:06.867 回答
2

Docrine2 于 2013 年更改,因此其他解决方案显示错误Error: Cannot add having condition on a non result variable.现在我们不能将连接别名用作条件变量。我们应该使用它的任何属性,比如c.id

因此,您应该将代码修复为

$qb->select('p', 'c')
   ->from('AcmeDemoBundle:POI', 'p')
   ->leftJoin('p.cities', 'c')
   ->where('c.id IS NOT NULL');
$results = $qb->getQuery()->execute();

如果要选择没有任何城市的实体,请使用IS NULL

$qb->leftJoin('p.cities', 'city')
    ->where('city.id IS NULL')
    ->getQuery()
    ->execute();

问题描述和负责该问题的提交的链接 - http://www.doctrine-project.org/jira/browse/DDC-2780

于 2015-05-04T16:06:52.170 回答