2011-05-09 4 views
8

Je veux implémenter une sous-requête en utilisant le constructeur de requête mais je ne comprends pas la syntaxe. J'ai affaire à une table d'emplacements qui a des entrées qui peuvent être des villes, des états ou des codes postaux en fonction du type de lieu. Je veux obtenir tous les endroits qui sont dans un certain état et en retirer tout type de ville et avoir une population inférieure à un certain montant.Doctrine 2 sous-requête

$qb->select('l') 
->from('Entity\Location', 'l') 
->where('l.state = :state') 
->setParameter('state', 'UT') 
->andWhere('...don't know what to put here'); 

Dans le etoù je besoin essentiellement dire

et où id pas (select id de l'endroit où location_type = 1 et population < 1000)

Mise à jour: J'ai été capable de le faire avec DQL directement, mais ce serait bien de voir comment le faire en utilisant le constructeur de requête.

$qb->andWhere('l.id NOT IN (SELECT l2.id FROM Entity\Location AS l2 WHERE l2.location_type = 1 AND l2.population < 1000)'); 
+0

On dirait que je n'ai même pas vraiment besoin d'une sous-requête. Cependant, Guilherme a également suggéré que je peux simplement utiliser une seconde instance de générateur de requêtes et l'utiliser comme deuxième argument d'une expression in. http://groups.google.com/group/doctrine-user/browse_thread/thread/f72c104fe334f87c –

Répondre

4

Dans la documentation de la doctrine que je trouve ceci:

// Example - $qb->expr()->in('u.id', array(1, 2, 3)) 
// Make sure that you do NOT use something similar to $qb->expr()->in('value', array('stringvalue')) as this will cause Doctrine to throw an Exception. 
// Instead, use $qb->expr()->in('value', array('?1')) and bind your parameter to ?1 (see section above) 
public function in($x, $y); // Returns Expr\Func instance 

// Example - $qb->expr()->notIn('u.id', '2') 
public function notIn($x, $y); // Returns Expr\Func instance 

Il devrait être possible de mettre un sous-requête dans cette fonction. Je ne l'ai jamais utilisé moi-même, mais d'après la documentation, ça devrait ressembler à ça.

$qb->select('l') 
    ->from('Entity\Location', 'l') 
    ->where('l.state = :state') 
    ->setParameter('state', 'UT') 
    ->andWhere($qb->expr()->notIn('u.id', 
     $qb->select('l2.id') 
      ->from('Entity\Location', 'l2') 
      ->where(l2.location_type = ?1 AND l2.population < ?2) 
      ->setParameters(array(1=> 1, 2 => 1000)) 
)); 

Je ne suis pas sûr à 100% que l'exemple ci-dessus est correct, mais essayez-le.