求助:使用Doctrine QueryBuilder实现带参数的关联查询
解决方案
错误原因
你之前的DQL语法错误,Doctrine DQL中关联实体时,要么通过实体已定义的关联属性进行join,要么使用WITH关键字指定关联条件,且关联变量需要放在实体类名前定义,而非类名之后。
QueryBuilder实现方式
方式一:基于实体关联(推荐)
如果Project和Product实体已定义双向关联(比如Project有$products属性对应关联的Product集合,Product有$project属性关联到Project),可直接通过关联属性join:
$qb = $entityManager->createQueryBuilder(); $projects = $qb->select('p.name', 'p.id') ->from('ArtoAcvBundle:Project', 'p') ->innerJoin('p.products', 'prod') // 使用实体关联属性join ->where('prod.weight != 0') ->andWhere('p.green_user_id = :userId') ->setParameter('userId', $userId) ->getQuery() ->getResult();
方式二:无实体关联时的原生join
如果实体未定义关联关系,可通过WITH关键字手动指定关联条件:
$qb = $entityManager->createQueryBuilder(); $projects = $qb->select('p.name', 'p.id') ->from('ArtoAcvBundle:Project', 'p') ->innerJoin( 'ArtoAcvBundle:Product', 'prod', \Doctrine\ORM\Query\Expr\Join::WITH, 'prod.project_id = p.id' ) ->where('prod.weight != 0') ->andWhere('p.green_user_id = :userId') ->setParameter('userId', $userId) ->getQuery() ->getResult();
修正后的DQL写法(可选)
如果仍想用DQL实现,正确写法如下:
SELECT p.name, p.id FROM ArtoAcvBundle:Project p JOIN p.products prod WHERE prod.weight != 0 AND p.green_user_id = :userId
或者无关联时:
SELECT p.name, p.id FROM ArtoAcvBundle:Project p JOIN ArtoAcvBundle:Product prod WITH prod.project_id = p.id WHERE prod.weight != 0 AND p.green_user_id = :userId
内容的提问来源于stack exchange,提问作者user3735247
相关产品推荐
相关产品推荐

