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...
en sus archivos de ramita, use los filtros de ayuda de ramita de 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 }}
Explicación:
Las otras respuestas que mencionan que la declaración preparada son en realidad "consultas reales" son correctas, pero no responden a la expectativa obvia del autor de la pregunta ... Todo desarrollador quiere mostrar una "consulta ejecutable" para la depuración (o para mostrarla al usuario) .
Entonces, busqué en la fuente del perfilador de Symfony para ver cómo lo hacen. La parte de Doctrine es responsabilidad de Doctrine, por lo que hicieron un paquete de doctrina para integrarse con Symfony. Echar un vistazo a ladoctrine-bundle/Resources/views/Collector/db.html.twig
archivo, descubrirá cómo lo hacen (esto puede cambiar según las versiones). Curiosamente, crearon filtros de ramitas que podemos reutilizar (ver arriba).
Para que todo funcione, debemos habilitar el registro para nuestra consulta. Hay varias formas de hacer esto y aquí utilizo DebugStack que permite registrar consultas sin realmente imprimirlas. Esto también asegura que esto funcionará en modo de producción si esto es lo que necesita ...
Si necesita más formatos, verá que incluyen algunos CSS en una etiqueta de estilo, así que simplemente "robe" ^^:
.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; }
Espero que esto ayude ;-)