2010-04-20 17 views
62

En Doctrina puede crear DQL de 2 maneras:doctrina: QueryBuilder vs createQuery?

EntityManager :: CreateQuery:

$query = $em->createQuery('SELECT u FROM MyProject\Model\User u WHERE u.id = ?1'); 

QueryBuilder:

$qb->add('select', 'u') 
    ->add('from', 'User u') 
    ->add('where', 'u.id = ?1') 
    ->add('orderBy', 'u.name ASC'); 

me preguntan cuál es la diferencia y lo que debería ¿Yo suelo?

Respuesta

60
  1. DQL es más fácil de leer, ya que es muy similar a SQL. Si no necesita cambiar la consulta en función de un conjunto de parámetros, esta es probablemente la mejor opción.

  2. Query Builder es una aplicación para construir consultas, por lo que es más fácil si necesita generar una consulta dinámicamente como iterar sobre un conjunto de parámetros o filtros. No necesita realizar ninguna operación de cadena para generar su consulta como join, split o lo que sea.

+0

¿Pero no hay una sobrecarga en el análisis de cadena DQL en el primer caso? ¿O el constructor hace la misma cadena DQL como resultado también? –

+2

Sí, QueryBuilder crea la cadena DQL por usted. Después de eso, DQL se analiza de todos modos. – Dennis

31

Generador de consultas es, digamos, la interfaz de consulta para crear ... Debería ser más cómodo de usar, que no acaban de método add(), sino también los métodos como en(), andWhere (), from(), etc. Pero al final, solo compone consultas como la que usa en el método createQuery().

Ejemplo de uso más avanzada del generador de consultas:

$em->createQueryBuilder() 
      ->from('Project\Entities\Item', 'i') 
      ->select("i, e") 
      ->join("i.entity", 'e') 
      ->where("i.lang = :lang AND e.album = :album") 
      ->setParameter('lang', $lang) 
      ->setParameter('album', $album); 
+0

puede agregar -> setParameters (array ('x' => 'y', 'z' => 'w', ...)) –

13

Ellos tienen diferentes propósitos:

  • DQL es más fácil de usar cuando se conoce su consulta completa.
  • Generador de consultas es más inteligente cuando se tiene que construir su consulta basada en algunas condiciones, bucles, etc.
4

La principal diferencia es la sobrecarga de llamar a los métodos. Su primer ejemplo de código (createQuery) solo por simplicidad hace una llamada a un método, mientras que el queryBuilder crea 4. Al final de todo, descienden a una cadena que debe ejecutarse, por ejemplo, le está dando la cadena, y el otro lo está construyendo con múltiples llamadas a métodos encadenados.

Si está buscando una razón para usar una sobre la otra, esa es una cuestión de estilo, y lo que parece más legible. Para mí, me gusta la queryBuider la mayor parte del tiempo, proporciona secciones bien definidas para la consulta. Además, en el pasado hace que sea más fácil agregar lógica condicional cuando la necesite.

+0

Una pequeña observación - Diría que casi cualquier momento en el que se gasta en cualquier número de las llamadas a función PHP, relacionadas con SQLing, siempre será menos crítico que el tiempo dedicado a hablar, esperar y extraer el resultado real de la base de datos (sin mencionar la hidratación de los mismos, en el caso de los ORM). – userfuser

1

Puede ser más fácil realizar una prueba unitaria al usar el generador de consultas. Digamos que tiene un repositorio que consulta algunos datos basándose en la complicada lista de condiciones. Y desea asegurarse de que si se pasa una condición particular al repositorio, se agregan algunas otras condiciones a la consulta. En el caso de DQL tiene dos opciones:

1) Para utilizar dispositivos y probar la interacción real con DB. Lo cual me parece algo problemático y sin cortes.

2) Para verificar el código DQL generado. Lo cual puede hacer que tu prueba sea demasiado frágil.

Con QueryBuilder, puede sustituirlo por simulacro y verificar que se llame al método "andWhere" con el parámetro necesario. Por supuesto, tales consideraciones no son aplicables si su consulta es simple y no depende de ningún parámetro.

Cuestiones relacionadas