【问题标题】:'where not in' query with doctrine query builder使用学说查询生成器进行“不在”查询
【发布时间】:2012-12-07 02:19:51
【问题描述】:

我正在尝试重现此查询:

SELECT * FROM `request_lines`
where request_id not in(
select requestLine_id from `asset_request_lines` where asset_id = 1 
)

在学说查询生成器中, 我被困在 request_id 不在的地方(选择

我目前有:

$linked = $em->createQueryBuilder()
        ->select('rl')
        ->from('MineMyBundle:MineRequestLine', 'rl')
        ->where()
        ->getQuery()
        ->getResult();

【问题讨论】:

    标签: symfony doctrine doctrine-orm doctrine-query


    【解决方案1】:

    您需要使用查询构建器表达式,这意味着您需要访问查询构建器对象。此外,如果您提前生成子选择列表,则代码更容易编写:

    $qb = $em->createQueryBuilder();
    
    $nots = $qb->select('arl')
              ->from('$MineMyBundle:MineAssetRequestLine', 'arl')
              ->where($qb->expr()->eq('arl.asset_id',1))
              ->getQuery()
              ->getResult();
    
    $linked = $qb->select('rl')
                 ->from('MineMyBundle:MineRequestLine', 'rl')
                 ->where($qb->expr()->notIn('rl.request_id', $nots))
                 ->getQuery()
                 ->getResult();
    

    【讨论】:

    • 这不可能在一个查询中实现吗?
    • 是的,使用威尔特的方法
    【解决方案2】:

    可以在一个 Doctrine 查询中做到这一点:

    $qb  = $this->_em->createQueryBuilder();
    $sub = $qb;
    
    $sub = $qb->select('arl')
              ->from('$MineMyBundle:MineAssetRequestLine', 'arl')
              ->where($qb->expr()->eq('arl.asset_id',1));
    
    $linked = $qb->select('rl')
                 ->from('MineMyBundle:MineRequestLine', 'rl')
                 ->where($qb->expr()->notIn('rl.request_id',  $sub->getDQL()))
                 ->getQuery()
                 ->getResult();
    

    查看reference in this answer here

    【讨论】:

    • 坦率地说,我更喜欢这个答案而不是我自己的
    • 很好的解决方案,谢谢!可以在逻辑上期望 ->where($qb->expr()->eq('x1.some_id', $sub->getDql())) 工作但 ->eq(...)->neq(...) 需要文字的地方使用相同的方法。只需使用->in(...)->notIn(...) 并将子查询的结果限制为单个返回值。
    • 可能很明显,但我短暂地抓住了我 - 如果您的子查询有参数,请确保将它们设置在主 QB 而不是子 QB 上,因为它们不会包含在最终调用时查询$sub->getDQL()
    • 我必须创建两个不同的查询构建器,因为在两个查询上都使用 $qb 会给我“arl 已经定义”。
    猜你喜欢
    • 1970-01-01
    • 2011-11-03
    • 2016-04-02
    • 2011-12-04
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多