Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.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 如何使用查询生成器基于内部连接关系编写具有distinct的自连接查询?_Php_Symfony_Doctrine Orm_Doctrine_Query Builder - Fatal编程技术网

Php 如何使用查询生成器基于内部连接关系编写具有distinct的自连接查询?

Php 如何使用查询生成器基于内部连接关系编写具有distinct的自连接查询?,php,symfony,doctrine-orm,doctrine,query-builder,Php,Symfony,Doctrine Orm,Doctrine,Query Builder,我有一个实体Place,它可以容纳许多不同类型的场所,特别是在本例中的“城市”和“州”,其中每个“城市”可以容纳指向父“州”的同一个表的引用 我有另一个实体办公室,与地点有多对一关系,但由于域限制,办公室将只链接到“城市”,而不会链接到“州” 我必须写一个查询,以获得我们有一个或多个办事处的所有州,但仅限于这些州 在纯SQL中,查询非常容易: 选择不同的状态* 从办公室 内部连接将城市放置在cities.id=o.place\u id上 内部连接将状态放置在cities.parent\u pla

我有一个实体
Place
,它可以容纳许多不同类型的场所,特别是在本例中的“城市”和“州”,其中每个“城市”可以容纳指向父“州”的同一个表的引用

我有另一个实体
办公室
,与
地点
有多对一关系,但由于域限制,办公室将只链接到“城市”,而不会链接到“州”

我必须写一个查询,以获得我们有一个或多个办事处的所有州,但仅限于这些州

在纯SQL中,查询非常容易:

选择不同的状态*
从办公室
内部连接将城市放置在cities.id=o.place\u id上
内部连接将状态放置在cities.parent\u place\u id=states.id上
其中p.place_type=‘城市’
这是可行的,我们得到了我们所需要的

但是我需要(我更愿意)使用查询生成器编写查询。这是“基本”查询,但我们需要有条件地应用多个过滤器,这将使QB的使用更加干净和易于管理

目前我们使用的是,但这意味着在调用
em::createNativeQuery()
之前,我们需要操作SQL字符串,这很麻烦

$qb=$this->getEntityManager()->createQueryBuilder();
$qb->select('states')->distinct()
->from(PartnerOffice::类“o”)
->innerJoin('o.place','p')
->innerJoin('p.parentPlace','states')
->其中(“p.placeType=‘城市’”);
但这给出了一个错误:

SELECT DISTINCT':错误:如果不选择至少一个根实体别名,则无法通过标识变量选择实体

我们如何才能使这个查询工作


感谢并问候。

我认为您发布了一个不完整的基本sql查询(
WHERE and
),并且您创建了一个别名
p.place\u type
,该别名未在查询中定义。 然而,从你的陈述中,我认为你可以尝试下面的查询

$qb->selectRaw('DISTINCT s.states')
->from('办公室为o')
->join('placeas c','c.id','=','o.place\u id')
->join('s's.id','=','c.parent\u place\u id'位置)
->其中('c.placeType','city')->get();
默认情况下,
->join()
引用queryBuilder中的内部联接

资料来源:


  • 在没有看到实体的情况下(至少对我来说),很难确定应该构建什么查询。你们有地图栏吗?但我认为您的问题是,您没有从PartnerOffice获取任何信息,而它是您的根条目(从)。更改
    ->select()
    ->addSelect
    ,但这将获取每个记录的整个PartnerOffice实体,您可能无法按预期工作,或者使用Place实体作为根条目并翻转逻辑

    让我们假设实体的关系是双向的。类似这样的东西应该可以做到这一点(但是您可能需要为真实的实体和字段名称更改它)


    谢谢你的“WHERE AND”更正,这是一个复制粘贴错误。但当问题是关于教义时,你回答的是雄辩。paceType不是别名。是一个
    位置
    属性。恐怕这个答案不太正确。无论如何谢谢(顺便说一句,我不能投赞成票或反对票)。我没有提到相反的关系,因为它不存在。唯一的关系是提到的那些,我认为这使得发布实体变得多余。然而,您的代码基本上是正确的。我只需将第二个关节更改为
    ->innerJoin(PartnerOffice::class'po',Join::WITH'po.place=p')
    。谢谢
    $this->getEntityManager()->createQueryBuilder()
        ->distinct()
        ->from(Place::class, 'p')
        ->join('p.cities', 'c')
        ->join(PartnerOffice::class, 'po', Join::WITH, 'po.place = p')
        ->andWhere('p.placeType = \'state\'');