2012-12-19 26 views
23

Im cố gắng để tái tạo truy vấn này:'nơi không trong' truy vấn với người xây dựng truy vấn học thuyết

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

trong xây dựng truy vấn giáo lý, Tôi đang mắc kẹt trên các nơi REQUEST_ID không (chọn

Tôi hiện có:

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

Trả lời

33

Bạn cần sử dụng biểu thức trình tạo truy vấn và điều này có nghĩa là bạn cần truy cập đối tượng trình tạo truy vấn. Ngoài ra, mã sẽ dễ viết hơn nếu bạn tạo subsele ct danh sách trước thời hạn:

$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

Đây có phải là không thể thực hiện trong một truy vấn? – Wilt

+1

Có, hãy kiểm tra câu trả lời của tôi dưới đây ... – Wilt

+0

Phải, sử dụng phương pháp của Wilt – Lighthart

21

Có thể để làm điều này trong một truy vấn Học thuyết:

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

Kiểm tra reference in this answer here

+2

Thành thật mà nói, tôi thích câu trả lời này cho riêng mình – Lighthart

+1

@Lighthart Lol :) Bạn có thể upvote nếu bạn thích ... – Wilt

+0

Giải pháp tuyệt vời, cảm ơn! Cách tiếp cận tương tự này có thể được sử dụng khi bạn mong đợi một cách hợp lý '-> ở đâu ($ qb-> expr() -> eq ('x1.some_id', $ sub-> getDql()))' để làm việc, nhưng '- > eq (...) 'hoặc' -> neq (...) 'mong đợi một chữ. Chỉ cần sử dụng '-> in (...)' hoặc '-> notIn (...)' và giới hạn kết quả của truy vấn con thành một giá trị trả về đơn. – iisisrael