2012-12-19 10 views
23

Im cercando di riprodurre questa query:'dove non in' query con generatore di query dottrina

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

nella dottrina generatore di query, mi sono bloccato sulla cui non request_id a (selezionare

Io attualmente hanno:

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

risposta

33

è necessario utilizzare espressioni generatore di query, e questo significa che è necessario l'accesso all'oggetto generatore di query Inoltre, il codice è più facile da scrivere se si genera il subsele. Lista ct prima del tempo:

$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

Non è questo possibile in una query? – Wilt

+1

Sì, controlla la mia risposta qui sotto ... – Wilt

+0

Sì, usa l'approccio di Wilt – Lighthart

21

E 'possibile farlo in una query Dottrina:

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

Controllare il reference in this answer here

+2

Francamente, preferisco questa risposta al mio – Lighthart

+1

@Lighthart Lol :) Puoi alzarti se ti piace ... – Wilt

+0

Ottima soluzione, grazie! Questo stesso approccio può essere usato dove ci si aspetterebbe logicamente '-> dove ($ qb-> expr() -> eq ('x1.some_id', $ sub-> getDql()))' per funzionare, ma il '- > eq (...) 'o' -> neq (...) 'si aspetta un valore letterale. Basta usare '-> in (...)' o '-> notIn (...)' e limitare i risultati della subquery ad un singolo valore di ritorno. – iisisrael