You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 00:45:58