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...
dans vos fichiers twig, utilisez les filtres twig helpers 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 }}
Explication:
Les autres réponses mentionnant que l'instruction Prepared sont en fait de "vraies requêtes" sont correctes, mais elles ne répondent pas aux attentes évidentes du demandeur ... Chaque développeur veut afficher une "requête exécutable" pour le débogage (ou l'afficher à l'utilisateur) .
J'ai donc regardé la source du profileur Symfony pour voir comment ils le faisaient. La partie Doctrine est de la responsabilité de Doctrine, ils ont donc créé un ensemble de doctrine à intégrer à Symfony. En regardant le doctrine-bundle/Resources/views/Collector/db.html.twig
fichier, vous découvrirez comment ils le font (cela peut changer d'une version à l'autre). Fait intéressant, ils ont créé des filtres de brindilles que nous pouvons réutiliser (voir ci-dessus).
Pour que tout fonctionne, nous devons activer la journalisation pour notre requête. Il existe plusieurs façons de le faire et j'utilise ici DebugStack qui permet de journaliser les requêtes sans les imprimer. Cela garantit également que cela fonctionnera en mode production si c'est ce dont vous avez besoin ...
Si vous avez besoin d'un formatage supplémentaire, vous verrez qu'ils incluent du CSS dans une balise de style, alors "volez-le" simplement ^^:
.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; }
J'espère que cela aidera ;-)