2012-12-19 42 views
23

我试着重现此查询:“其中没有”教义查询生成器查询

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

回答

33

您需要使用查询生成器表达式,这意味着你需要访问查询生成器对象此外,代码更容易,如果你生成subsele写。提前CT名单:

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

在一个查询中这是不可能的? – Wilt

+1

是的,检查我的答案下面... – Wilt

+0

是的,使用Wilt的方法 – Lighthart

21

这是可能做到这一点的一个学说查询:

$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

+2

坦率地说,我更喜欢这个答案我自己 – Lighthart

+1

@Lighthart哈哈:)你可以upvote,如果你喜欢它... – Wilt

+0

伟大的解决方案,谢谢!可以在逻辑上期望' - > where($ qb-> expr() - > eq('x1.some_id',$ sub> getDql()))'工作的地方使用同样的方法,但是' > eq(...)'或' - > neq(...)'需要一个文字。只需在(...)或' - > notIn(...)'中使用' - >并将子查询的结果限制为单个返回值。 – iisisrael