2012-06-27 21 views
11

Para depurar mi código, me gustaría ver la consulta explícita SQL que se ejecuta.¿Cómo veo los parámetros en una consulta?

puedo crear la consulta con createQueryBuilder, y lo más explícito que he conseguido es tener la consulta cruda usando:

$qb->getQuery()->getSQL(); 

El problema es que en lugar de los parámetros que veo los soportes (?). Encontré algunas soluciones en la web pero son para 1.3 y 1.4, nada para Symfony-2.

Ideas? ¡Gracias!

+3

En realidad, su pregunta es un duplicado de este http://stackoverflow.com/q/2095394/795876. Doctrine está utilizando una declaración preparada, por lo tanto, nunca hay una consulta SQL "real" en el lado de PHP y Doctrine no puede mostrarla. Sin embargo, puede leer esta solución http://stackoverflow.com/a/10577703/795876 para su depuración. – fsenart

+2

Además, la doctrina 2 tiene la clase sqlLogger: http://doctrine-orm.readthedocs.org/en/2.0.x/reference/configuration.html#sql-logger-optional – manix

+0

** fsehat ** - se parece a esta solución es para Symfony 1.4, no pude encontrar en el proyecto ni la función 'getSqlQuery' ni' getFlattenedParams' (que es la función que me falta). ** manix ** - ¿Tiene alguna referencia para obtener más documentación sobre cómo usar el registrador en Symfony 2.x? Parece una buena solución, pero no encuentro ninguna buena documentación. ** ¡Gracias por los dos! ** – guyaloni

Respuesta

27

Se puede acceder a los parámetros utilizados por los marcadores de posición utilizando $query->getParameters(), por lo que podría depurar su consulta mediante:

$query = $qb->getQuery(); 
print_r(array(
    'sql'  => $query->getSQL(), 
    'parameters' => $query->getParameters(), 
)); 
+2

Básicamente es una buena idea.El problema es que la bolsa de parámetros puede contener objetos y, a continuación, tratar de imprimir da una gran cantidad de cadenas. Lo que me gustaría hacer es convertir la bolsa de parámetros que devuelve '$ query-> getParameters()' a una matriz de cadenas que pueden reemplazar los marcadores de posición '?'. – guyaloni

+2

Creo que esta matriz ya es una matriz de valores escalares, si nos fijamos en el método setParameter https://github.com/doctrine/doctrine2/blob/2.2/lib/Doctrine/ORM/AbstractQuery.php#L202, call processParameterValue que transforma matriz y objetos a valores escalares https://github.com/doctrine/doctrine2/blob/2.2/lib/Doctrine/ORM/AbstractQuery.php#L227 – AdrienBrault

+0

Gracioso, tengo (por lo que entiendo ... .) la última versión de todos los proveedores, y mis 'AbstractQuery.php' y' Query.php' son un poco diferentes. Probablemente lo que tengo es Doctrine 2.1, mientras que este código es 2.2. De todos modos, agregué un método a mi archivo 'Query.php' que devuelve los parámetros raw sql +, en función de sus respuestas. ¡Gracias! – guyaloni

2

Puede acceder fácilmente a los parámetros de SQL utilizando el siguiente enfoque.

$result = $qb->getQuery()->getSQL(); 

    $param_values = ''; 
    $col_names = ''; 

    foreach ($result->getParameters() as $index => $param){    
      $param_values .= $param->getValue().','; 
      $col_names .= $param->getName().','; 
    } 

    //echo rtrim($param_values,','); 
    //echo rtrim($col_names,',');  

Así que si usted imprimió el $param_values y $col_names, puede obtener los valores de los parámetros que pasan a través del SQL y nombres de las columnas respectivas.

Nota: Si $param devuelve una matriz, necesita volver a iterar, ya que los parámetros dentro de IN (:?) generalmente vienen como una matriz anidada.

Mientras tanto, si usted encuentra otro enfoque, por favor ten la amabilidad de compartir con nosotros :)

Gracias!

0

Tuve que construir una unión requete (imposible con DQL o QueryBuilder) con 5 consultas ya compiladas con QueryBuilder. Así que reutilizo estas consultas, pero tuve un problema al usar la función getParameters() porque da el parámetro en el mismo orden que usted lo ha dado. Una de las ventajas cuando utiliza el generador de consultas es que puede crear una consulta en el orden que desee, pero cuando recupera los parámetros, puede recuperarlos en un estado desordenado. Para evitar esto he construido la siguiente función:

$getSqlWithParams = \Closure::bind(function(){ 
     return [$this->getSql(), $this->processParameterMappings($this->_parserResult->getParameterMappings())]; 
    }, null, Query::class); 

ahora cuando se quiere recuperar SQL y los parámetros ordenados haces:

$getSqlWithParams()->call($query) 

No se olvide de uso \ comunicado Doctrine \ ORM \ query . ¡Y listo!

Cuestiones relacionadas