2011-05-09 22 views
8

Deseo implementar una subconsulta con el generador de consultas, pero no entiendo la sintaxis. Estoy tratando con una tabla de ubicaciones que tiene entradas que pueden ser ciudades, estados o códigos postales dependiendo del tipo de ubicación establecido. Quiero obtener todas las ubicaciones que se encuentran en cierto estado y eliminar todas las que sean de tipo ciudad y que tengan una población inferior a cierta cantidad.Subconsulta de Doctrine 2

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

En el andWhere básicamente lo que necesito decir

y donde id no en (SELECT ID de ubicación en la location_type = 1 y la población < 1000)

actualización: Pude hacer esto con DQL directo, pero sería bueno ver cómo hacerlo usando el generador de consultas.

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

Parece que ni siquiera necesito una subconsulta en realidad. Sin embargo, Guilherme también sugirió que puedo usar una segunda instancia del generador de consultas y usar eso como el segundo argumento de una expresión en. http://groups.google.com/group/doctrine-user/browse_thread/thread/f72c104fe334f87c –

Respuesta

4

En la documentación de la Doctrina encontré esto:

// 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 

Debe ser posible poner una subconsulta en esta función. Nunca lo usé yo mismo, pero de acuerdo con la documentación debería verse así.

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

No estoy 100% seguro de que el ejemplo anterior sea correcto, pero inténtelo.