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...
trong các tệp twig của bạn, hãy sử dụng các bộ lọc trợ giúp twig của 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 }}
Giải trình:
Các câu trả lời khác đề cập rằng tuyên bố Chuẩn bị thực sự là "truy vấn thực" là đúng, nhưng chúng không trả lời kỳ vọng của người hỏi rõ ràng ... Mọi nhà phát triển đều muốn hiển thị "truy vấn có thể chạy" để gỡ lỗi (hoặc hiển thị cho người dùng) .
Vì vậy, tôi đã xem xét nguồn của hồ sơ Symfony để xem cách họ làm điều đó. Phần học thuyết là trách nhiệm của Học thuyết nên họ đã tạo ra một gói học thuyết để tích hợp với Symfony. Nhìn vào doctrine-bundle/Resources/views/Collector/db.html.twig
tập tin, bạn sẽ tìm ra cách họ làm điều đó (điều này có thể thay đổi giữa các phiên bản). Thật thú vị, họ đã tạo ra các bộ lọc twig mà chúng ta có thể sử dụng lại (xem bên trên).
Để mọi thứ hoạt động, chúng tôi cần kích hoạt Ghi nhật ký cho truy vấn của chúng tôi. Có nhiều cách để làm điều này và ở đây tôi sử dụng DebugStack cho phép ghi nhật ký truy vấn mà không thực sự in chúng. Điều này cũng đảm bảo rằng nó sẽ hoạt động trong chế độ sản xuất nếu đây là thứ bạn cần ...
Nếu bạn cần định dạng thêm, bạn sẽ thấy rằng chúng bao gồm một số CSS trong thẻ kiểu, vì vậy chỉ cần "đánh cắp" nó ^^:
.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; }
Hy vọng, điều này sẽ giúp ;-)