2012-06-27 20 views
11

Per eseguire il debug del mio codice mi piacerebbe vedere la query sql esplicita che viene eseguita.Come visualizzare i parametri in una query?

ho creare la query con createQueryBuilder, e la cosa più esplicito ho raggiunto sta avendo la query grezzo usando:

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

Il problema è che invece di parametri vedo i titolari (?). Ho trovato alcune soluzioni sul web ma sono per 1.3 e 1.4, niente per Symfony-2.

Idee? Grazie!

+3

In realtà, la tua domanda è un duplicato di questo http://stackoverflow.com/q/2095394/795876. Doctrine sta usando istruzioni preparate, quindi non c'è mai una query SQL "reale" sul lato PHP e Doctrine non può visualizzarlo. Tuttavia puoi leggere questa soluzione http://stackoverflow.com/a/10577703/795876 a scopo di debug. – fsenart

+2

Inoltre, doctrine 2 ha la classe sqlLogger: http://doctrine-orm.readthedocs.org/en/2.0.x/reference/configuration.html#sql-logger-optional – manix

+0

** fsehat ** - assomiglia a questa soluzione è per Symfony 1.4, non sono riuscito a trovare nell'intero progetto né la funzione 'getSqlQuery' né' getFlattenedParams' (che è la funzione che mi manca). ** manix ** - avete qualche riferimento per ulteriore documentazione su come usare il logger in Symfony 2.x? Sembra una buona soluzione, ma non trovo documentazione valida. ** Grazie per entrambi! ** – guyaloni

risposta

27

È possibile accedere ai parametri utilizzati dai segnaposto utilizzando $query->getParameters(), così da poter eseguire il debug query utilizzando:

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

Fondamentalmente è una bella idea.Il problema è che il sacchetto dei parametri potrebbe contenere oggetti, e quindi provare a stamparlo dà una stringa enorme. Quello che mi piacerebbe fare è convertire la borsa dei parametri che viene restituita da '$ query-> getParameters()' a una matrice di stringhe che può sostituire i segnaposto '?'. – guyaloni

+2

Penso che questa matrice sia già una matrice di valori scalari, se si osserva il metodo setParameter https://github.com/doctrine/doctrine2/blob/2.2/lib/Doctrine/ORM/AbstractQuery.php#L202, chiama processParameterValue che trasforma array e oggetti in valori scalari https://github.com/doctrine/doctrine2/blob/2.2/lib/Doctrine/ORM/AbstractQuery.php#L227 – AdrienBrault

+0

Divertente, ho ottenuto (per quanto ho capito .. .) l'ultima versione di tutti i fornitori, e il mio 'AbstractQuery.php' e' Query.php' sono un po 'diversi. Probabilmente quello che ho è Doctrine 2.1 mentre questo codice è 2.2. Ad ogni modo, ho aggiunto un metodo al mio file 'Query.php' che restituisce i parametri raw sql +, in base alle tue risposte. Grazie! – guyaloni

2

Si può facilmente accedere ai parametri SQL utilizzando il seguente approccio.

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

Quindi, se si stampa la $param_values e $col_names, è possibile ottenere i valori dei parametri che passano attraverso lo SQL e rispettivi nomi delle colonne.

Nota: se $param restituisce un array, è necessario ripetere iterare, poiché i parametri all'interno di IN (:?) di solito provengono da un array nidificato.

Nel frattempo se avete trovato un altro approccio, si prega di essere così gentile da condividere con noi :)

Grazie!

0

Ho dovuto creare un unione richiesta (impossibile con DQL o QueryBuilder) con 5 query già create con QueryBuilder. Quindi riuso queste query ma ho avuto un problema usando la funzione getParameters() perché fornisce il parametro nello stesso ordine in cui l'hai fornito. Uno dei vantaggi quando si utilizza il generatore di query è che è possibile creare una query nell'ordine desiderato ma quando si recuperano i parametri, è possibile recuperarli in modo disordinato. per evitare questo ho costruito la seguente funzione:

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

ora quando si desidera recuperare SQL ed i parametri ordinati che fai:

$getSqlWithParams()->call($query) 

Non dimenticare uso \ dichiarazione Doctrine \ ORM \ Query . E voilà!

Problemi correlati