web-dev-qa-db-fra.com

'where not in' query with doctrine builder de requête

Im essayant de reproduire cette requête:

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

dans doctrine constructeur de requêtes, je suis coincé sur le où request_id n'est pas (sélectionnez

J'ai actuellement:

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

Vous devez utiliser des expressions de générateur de requête, ce qui signifie que vous devez avoir accès à l'objet de générateur de requête. En outre, le code est plus facile à écrire si vous générez la liste de sous-sélection à l'avance:

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

Il est possible de le faire en une seule requête 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();

Vérifiez le référence dans cette réponse ici

28
Wilt