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...
в файлах веток используйте фильтры помощников 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 }}
Объяснение:
Другие ответы, в которых говорится, что подготовленный оператор на самом деле являются «реальными запросами», верны, но они не отвечают очевидным ожиданиям запрашивающего ... Каждый разработчик хочет отобразить «выполняемый запрос» для отладки (или отобразить его пользователю) ,
Итак, я заглянул в источник профайлера Symfony, чтобы узнать, как они это делают. Часть Доктрины является обязанностью Доктрины, поэтому они создали пакет учений для интеграции с Symfony. Посмотрев на doctrine-bundle/Resources/views/Collector/db.html.twig
файл, вы узнаете, как они это делают (это может измениться в разных версиях). Интересно, что они создали фильтры веточек, которые мы можем использовать повторно (см. Выше).
Чтобы все работало, нам нужно включить ведение журнала для нашего запроса. Есть несколько способов сделать это, и здесь я использую DebugStack, который позволяет регистрировать запросы без фактической их печати. Это также гарантирует, что это будет работать в производственном режиме, если это то, что вам нужно ...
Если вам понадобится дальнейшее форматирование, вы увидите, что они включают в себя некоторый CSS в теге стиля, поэтому просто «украдите» его ^^:
.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; }
Надеюсь, это поможет ;-)