Doctrine2获取QueryBuilder具有manyToMany关联的行

时间:2011-09-25 11:46:58

标签: php symfony doctrine query-builder

大家。 我有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()函数,但我不知道怎么做。

2 个答案:

答案 0 :(得分:6)

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

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

我没有测试过,但我希望它能为您提供一般指导。您可以从here了解有关QueryBuilder的更多信息。

答案 1 :(得分: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