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