我有两个实体:
LinkServInfra实体:
现在,我想根据下文获取一份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
你会怎么做?
谢谢!
答案 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();
}
我认为这不是最干净的解决方案,但它的工作......