Symfony ';不在';使用条令查询生成器进行查询

Symfony ';不在';使用条令查询生成器进行查询,symfony,doctrine,doctrine-orm,doctrine-query,Symfony,Doctrine,Doctrine Orm,Doctrine Query,我正在尝试重现此查询: SELECT * FROM `request_lines` where request_id not in( select requestLine_id from `asset_request_lines` where asset_id = 1 ) 在查询生成器中, 我被where request_id not in卡住了(选择 我目前有: $linked = $em->createQueryBuilder() ->select('rl')

我正在尝试重现此查询:

SELECT * FROM `request_lines`
where request_id not in(
select requestLine_id from `asset_request_lines` where asset_id = 1 
)
在查询生成器中, 我被where request_id not in卡住了(选择

我目前有:

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

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

$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();

可以在一个条令查询中执行此操作:

$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();

检查一下

这在一个查询中是不可能的吗?是的,使用Wilt的方法坦白地说,我更喜欢这个答案而不是我自己的伟大的解决方案,谢谢!同样的方法可以用在逻辑上期望
->where($qb->expr()->eq($x1.some_id',$sub->getDql())
工作的地方,但是
->eq(…)
->neq(…)
需要一个文本。只需在(…)中使用
->
->notIn(…)
并将子查询的结果限制为单个返回值。可能很明显,但我很快就发现了-如果您的子查询有参数,请确保在主QB而不是子QB上设置它们,因为调用
$sub->getDQL()时,它们不会包含在最终查询中
我必须创建两个不同的查询生成器,因为在这两个查询中使用$qb将得到“arl已定义”。