Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Doctrine2通过QueryBuilder获取具有多个关联的行_Php_Symfony_Doctrine_Query Builder - Fatal编程技术网

Php Doctrine2通过QueryBuilder获取具有多个关联的行

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是否为空

各位。 我有两个实体城市和POI。映射如下所示:

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();