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, чтобы узнать, как они это делают. Часть Doctrine - это ответственность Doctrine, поэтому они сделали пакет доктрины для интеграции с 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; }
Надеюсь, это поможет ;-)
person
Vincent Pazeller
schedule
26.09.2019