Php Doctrine2通过QueryBuilder获取具有多个关联的行
各位。 我有两个实体城市和POI。映射如下所示:Php Doctrine2通过QueryBuilder获取具有多个关联的行,php,symfony,doctrine,query-builder,Php,Symfony,Doctrine,Query Builder,各位。 我有两个实体城市和POI。映射如下所示: class City { /** * @ORM\ManyToMany(targetEntity="POI", mappedBy="cities") * @ORM\OrderBy({"position" = "ASC"}) */ protected $pois; 及 我想使用QueryBuilder获取与某个城市至少有1个关联的所有POI。我可能应该使用exists()函数,但我不知道如何使用。您必须左键加入它们,并检查cities是否为空
class City {
/**
* @ORM\ManyToMany(targetEntity="POI", mappedBy="cities")
* @ORM\OrderBy({"position" = "ASC"})
*/
protected $pois;
及
我想使用QueryBuilder获取与某个城市至少有1个关联的所有POI。我可能应该使用exists()函数,但我不知道如何使用。您必须
左键加入它们,并检查cities
是否为空
$qb->select('p', 'c')
->from('AcmeDemoBundle:POI', 'p')
->leftJoin('p.cities', 'c')
->where('c IS NOT NULL');
我还没有测试过它,但我希望它能为您提供大致的指导。您可以从中阅读有关QueryBuilder的更多信息。Docrine2在2013年更改,因此另一个解决方案显示错误错误:无法在非结果变量上添加having条件。
现在我们不能将联接别名用作条件变量。我们应该使用它的任何属性,如c.id
因此,您应该将代码修复为
$qb->select('p', 'c')
->from('AcmeDemoBundle:POI', 'p')
->leftJoin('p.cities', 'c')
->where('c.id IS NOT NULL');
$results = $qb->getQuery()->execute();
如果要选择没有任何城市的实体,请使用为NULL
$qb->leftJoin('p.cities', 'city')
->where('city.id IS NULL')
->getQuery()
->execute();
对问题的描述和负责该问题的提交的链接-这在语法上是正确的,除了错误的名称空间分隔符“:”应该是“\”(反斜杠)。但是,使用innerJoin而不是带有额外where子句的leftJoin可能更快、更清晰。@Max我很确定分隔符应该是“:”因为我自己也使用过它。实际上,使用innerJoin可能会更快。结果实际上也应该分组。哦,关于分隔符,你是对的,忽略了symfony 2标记;)不知道你所说的“结果实际上也应该分组”是什么意思,但是是的。@Max-well,内部连接和左连接都可以返回几个具有相同id的POI(对于POI拥有的每个城市),至少在普通SQL中是这样。我不确定Doctrine是否能处理这个问题。我明白了……Doctrine为您处理这个问题,并将返回的行展平,以便POI集合包含唯一的对象(唯一性基于实体的主键)。
$qb->leftJoin('p.cities', 'city')
->where('city.id IS NULL')
->getQuery()
->execute();