TL;博士
$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...
在你的 twig 文件中,使用 Doctrine 的 twig helpers 过滤器:
// 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 }}
解释:
提到 Prepared 语句实际上是“真正的查询”的其他答案是正确的,但它们没有回答明显的提问者的期望......每个开发人员都希望显示一个“可运行的查询”以进行调试(或将其显示给用户) .
所以,我查看了 Symfony profiler 的源代码,看看他们是如何做到的。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; }
希望,这会有所帮助;-)