symfony “Where not in”查询与原则查询生成器

xfb7svmp  于 2022-11-16  发布在  其他
关注(0)|答案(3)|浏览(213)

我正在尝试重现此查询:

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

7kjnsjlb1#

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

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

kzmpq1sx2#

可以在一个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

b09cbbtk

b09cbbtk3#

使用Symfony 5,这个解决方案可能会帮助那些试图在子查询上设置参数的人,**notIn()**第二个参数接受一个数组,或者您可以传递一个DQL,这就是我们在这里所做的,请记住,参数应该添加到主查询中,如下所示。

$main  = $this->em->createQueryBuilder();
$sub = $main;

$sub = $sub->select('arl')
          ->from('$MineMyBundle:MineAssetRequestLine', 'arl')
          ->where($sub->expr()->eq('arl.asset_id',':id'));

$linked = $main->select('rl')
             ->from('MineMyBundle:MineRequestLine', 'rl')
             ->where($main->expr()->notIn('rl.request_id',  $sub->getDQL()))
             ->setParameter('id', 1)
             ->getQuery()
             ->getResult();

相关问题