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...
Verwenden Sie in Ihren Zweigdateien die Zweighilfefilter von 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 }}
Erläuterung:
Die anderen Antworten, in denen erwähnt wird, dass vorbereitete Anweisungen tatsächlich "echte Abfragen" sind, sind richtig, aber sie beantworten nicht die offensichtlichen Erwartungen des Fragestellers ... Jeder Entwickler möchte eine "ausführbare Abfrage" zum Debuggen anzeigen (oder sie dem Benutzer anzeigen). .
Also habe ich in der Quelle des Symfony-Profilers nachgesehen, wie sie das machen. Der Doctrine-Teil liegt in der Verantwortung von Doctrine, daher haben sie ein Doctrine-Bündel zur Integration in Symfony erstellt. Einen Blick auf diedoctrine-bundle/Resources/views/Collector/db.html.twig
Datei , werden Sie herausfinden, wie sie dies tun (dies kann sich je nach Version ändern). Interessanterweise haben sie Zweigfilter erstellt, die wir wiederverwenden können (siehe oben).
Damit alles funktioniert, müssen wir die Protokollierung für unsere Abfrage aktivieren. Es gibt mehrere Möglichkeiten, dies zu tun, und hier verwende ich DebugStack, mit dem Abfragen protokolliert werden können, ohne sie tatsächlich zu drucken. Dies stellt auch sicher, dass dies im Produktionsmodus funktioniert, wenn Sie dies benötigen ...
Wenn Sie weitere Formatierungen benötigen, werden Sie feststellen, dass sie CSS in einem Style-Tag enthalten. Stehlen Sie es also einfach ^^:
.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; }
Hoffe das wird helfen ;-)