2012-04-14 13 views
5

tengo mis dos clases User y Role, y necesito hacer una QueryBuilder que devuelve una consulta para los usuarios que tienen el rol ROLE_PROVIDER. Necesito esto para un campo de formulario de la entidad en Symfony 2. En la definición del formulario Clase Tengo el siguiente fragmento de código para el campo mencionado:Doctrina 2 en Symfony 2 - Filtrado de una QueryBuilder por una asociación

$builder->add('provider', 'entity', array(
    'class' => 'ElCuadreAccountBundle:User', 
    'property' => 'username', 
    'query_builder' => function(UserRepository $ur) { 
         return $ur->getUsersByRoleQB('ROLE_PROVIDER'); 
         }, 
    'required' => true, 
)); 

Y luego en mi encargo UserRepository tengo la siguiente función, que debe devolver una QueryBuilder objeto:

public function getUsersByRoleQB($role) { 
    $qb = $this->createQueryBuilder('u'); 
    return $qb->join('u.roles','r') 
       ->where($qb->expr()->in('r.role',$qb->expr()->literal($role))) 
       ->orderBy('u.username', 'ASC'); 
} 

Por supuesto, esto no funciona, pero me pegó para ilustrar mis necesidades.

He estado buscando y parece que Doctrine2 no admite el filtrado nativo de una asociación. En this page lo dicen, y sugieren usar DQL para este tipo de filtrado. Mi problema es que no he encontrado cómo hacer un objeto QueryBuilder a partir de una sentencia DQL. Si también pudiera proporcionarme la consulta correcta DQL, le estaría muy agradecido ...

¡Gracias por su ayuda!

Respuesta

11

donde debería hacer realmente lo que quiera. Sólo tiene la sintaxis incorrecta para 'in':

Este

->where($qb->expr()->in('r.role',$qb->expr()->literal($role))) 

Debe ser

->where($qb->expr()->in('r.role',$role)) 

Sé que puede parecer un poco extraño, pero ya declaraciones preparadas no apoyan directamente las matrices, los parámetros a las cláusulas IN siempre tienen que escapar individualmente (qué doctrina hace por usted). Por lo tanto, la sintaxis es un poco diferente, entonces digamos para una expresión eq donde se requiere literal.

Usted plantea una buena pregunta porque he necesitado filtrar por asociación. Creo que D2.2 permitirá esto fuera de la caja. En realidad no he probado pero sospecho que

$dql = 'a,b FROM whatever...'; // Don't start with SELECT 
$qb->select($dql); 
return $qb; 

pueda realmente funcionar sin especificar cualquier otra parte, siempre y cuando su licencia por la cadena real 'SELECT' de los $ DQL. No probado.

+0

Gracias! realmente completa la respuesta ... Una pregunta, no está muy relacionada con la pregunta original, pero aquí voy ... He leído varias veces que vienen nuevas versiones de symfony 2 y doctrina 2, y la gente parece tener conocimiento de la nuevas características, pero estoy cansado de ejecutar 'php bin/vendors install', y no actualiza ni symfony ni doctrine ... ¿cómo puedo actualizar? ¿o cuándo serían esas nuevas versiones oficiales? ¡¡¡gracias por tu respuesta!!! – Throoze

+0

Puede leer acerca de D2.2 aquí: http://www.doctrine-project.org/. S2 no tendrá D2.2 integrado hasta que se libere S2.1, probablemente este verano. Sin embargo, puede instalar D2.2 directamente, ajustar sus rutas en autoload.php y, en su mayor parte, su código de doctrina debería funcionar. Verifique los documentos para ver las cosas que debe tener en cuenta. – Cerad

+0

¡Gracias por tus respuestas! – Throoze

3

aún más simple todavía se puede hacer:

->where('r.role IN (:role)') 
->setParameter('role', $role); 

Me parece mucho más legible que la adición de $ qb-> expr() ...

Cuestiones relacionadas