TL; DR
$qb = ... // your query builder
$query = $qb->getQuery();
// temporarily enable logging for your query (will also work in prod env)
$conf = $query->getEntityManager()->getConnection()->getConfiguration();
$backupLogger = $conf->getSQLLogger();
$logger = new \Doctrine\DBAL\Logging\DebugStack();
$conf->setSQLLogger($logger);
// execute query
$res = $query->getResult();
$conf->setSQLLogger($backupLogger); //restore logger for other queries
$params = [
'query' => array_pop($logger->queries) //extract query log details
//your other twig params here...
]
return $params; //send this to your twig template...
nei tuoi file ramoscello, usa i filtri per gli aiutanti del ramoscello di Doctrine:
// show raw query:
{{ (query.sql ~ ';')|doctrine_replace_query_parameters(query.params)
// highlighted
{{ (query.sql ~ ';')|doctrine_replace_query_parameters(query.params)|doctrine_pretty_query(highlight_only = true) }}
// highlighted and formatted (i.e. with tabs and newlines)
{{ (query.sql ~ ';')|doctrine_replace_query_parameters(query.params)|doctrine_pretty_query }}
Spiegazione:
Le altre risposte che menzionano che l'istruzione Prepared sono in realtà "query reali" sono giuste, ma non rispondono alle ovvie aspettative del richiedente ... Ogni sviluppatore desidera visualizzare una "query eseguibile" per il debug (o mostrarla all'utente) .
Quindi, ho esaminato la fonte del profiler di Symfony per vedere come lo fanno. La parte di Dottrina è responsabilità di Doctrine, quindi hanno creato un fascio di dottrine da integrare con Symfony. Dando un'occhiata al doctrine-bundle/Resources/views/Collector/db.html.twig
file, scoprirai come lo fanno (questo potrebbe cambiare tra le versioni). È interessante notare che hanno creato filtri ramoscello che possiamo riutilizzare (vedi sopra).
Perché tutto funzioni, dobbiamo abilitare la registrazione per la nostra query. Esistono diversi modi per farlo e qui uso DebugStack che consente di registrare le query senza stamparle. Ciò garantisce anche che funzionerà in modalità di produzione se questo è ciò di cui hai bisogno ...
Se hai bisogno di ulteriore formattazione, vedrai che includono alcuni CSS in un tag di stile, quindi semplicemente "rubalo" ^^:
.highlight pre { margin: 0; white-space: pre-wrap; }
.highlight .keyword { color: #8959A8; font-weight: bold; }
.highlight .word { color: #222222; }
.highlight .variable { color: #916319; }
.highlight .symbol { color: #222222; }
.highlight .comment { color: #999999; }
.highlight .backtick { color: #718C00; }
.highlight .string { color: #718C00; }
.highlight .number { color: #F5871F; font-weight: bold; }
.highlight .error { color: #C82829; }
Spero che questo possa aiutare ;-)