2012-12-19 2 views
23

임이 쿼리 재현하려고 :'어디 있지의'교리 쿼리 빌더 쿼리

SELECT * FROM `request_lines` 
where request_id not in(
select requestLine_id from `asset_request_lines` where asset_id = 1 
) 
교리 쿼리 빌더에서

, 나에 (현재

I을 선택하지 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

그레이트 솔루션, 감사합니다! 이 같은 접근법은 논리적으로 ($ qb-> expr() -> eq ('x1.some_id', $ sub> getDql())')가 작동하도록'-> > eq (...)'또는'-> neq (...)'는 리터럴을 기대합니다. (...)'또는'-> notIn (...)'을 사용하고 하위 쿼리의 결과를 단일 반환 값으로 제한하면됩니다. – iisisrael