学说:选择一个关系实体

时间:2018-01-10 16:05:44

标签: symfony doctrine-orm symfony-2.7

我有两个实体:

  • LinkServInfra
  • 提供商

LinkServInfra实体:

  • id
  • serv(关系OneToOne to Serv)
  • infra(ManyToOne到另一个实体)

现在,我想根据下文获取一份Serv列表。

所以我尝试了LinkServInfraRepository:

    $qb = $this->createQueryBuilder('s')
            ->select('DISTINCT s.serv')
            ->where('s.infra = :infra')
            ->setParameter('infra', $infra);
    return $qb->getQuery()->getResult();

我收到错误:

    [Semantical Error] near 'serv FROM': Error: InvalidPathExpression. 
     Must be a StateFieldPathExpression.

(我首先尝试没有DISTINCT并根据此处的答案尝试使用它。)

查询似乎很好,因为它是:

    SELECT DISTINCT s.serv 
    FROM MyBundle\Entity\LinkServInfra s 
    WHERE s.infra = :infra
你会怎么做? 谢谢!

2 个答案:

答案 0 :(得分:0)

我认为您不能对关系使用 DISTINCT ,仅针对根实体别名

您应该以root身份使用 Serv 实体,并通过第二个加入 LinkServInfra infra 实体。类似的东西:

$qb = $this->getDoctrine()
        ->getRepository(Serv::class)->createQueryBuilder('s')
        ->select('DISTINCT s')
        ->leftJoin("s.linkServInfra", "lsi")
        ->leftJoin("lsi.infra", "infra")
        ->where('infra.id = :infra')
        ->setParameter('infra', 1);

答案 1 :(得分:0)

由于该关系仅在LinkServInfra中而不在Serv中:

我使用LinkServInfra中的关系来做...

    public function filter($type, $etat, $infra){

    $qb = $this->createQueryBuilder('l');
    $qb->where(' l.infra = :infra ')
       ->setParameter('infra', $infra);

    if( $type || $etat ){
       $qb->join('l.serv', 's')
       //where & setParameter for type
       //where & setParameter for detail
    }

然后我调用函数filter

    $entities = $em->getRepository('linkServInfra')->filter(//...
    $servs = array();
    foreach($entities as $entity){
        $servs[] = $entity->getServ();

    }

我认为这不是最干净的解决方案,但它的工作......

相关问题