SQL Formatter онлайн
Розкладає однорядковий запит на читабельний: відступи, ключові слова у верхньому регістрі, діалект MySQL або PostgreSQL.
Робить запит із логу читабельним за секунду
Запит із slow query log або з DB::listen приходить в один рядок на пів екрана, і зрозуміти, де там JOIN, а де підзапит, неможливо. Інструмент розкладає його за ключовими словами з відступами, приводить ключові слова до одного регістру й знає діалекти MySQL і PostgreSQL.
У самому PHP форматера SQL немає: запити форматують інструменти бази або пакети на кшталт doctrine/sql-formatter, який використовує Symfony у профайлері. Головне ж джерело запитів для форматування це логування: у Laravel DB::listen, у Doctrine SQL-логер, у чистому PDO обгортка над query.
// Laravel: побачити запити, які реально йдуть у базу
DB::listen(function (QueryExecuted $query) {
Log::debug($query->toRawSql(), ['ms' => $query->time]);
});
// один білдер без виконання
$sql = Job::query()->where('status', 'active')->orderByDesc('published_at')->toRawSql();
Що питають про цей інструмент
Ні, лише пробіли, переноси й регістр ключових слів. Імена таблиць і колонок лишаються як є, бо в PostgreSQL їхній регістр значущий, якщо вони в лапках. Результат виконується так само, як оригінал.
DB::listen у сервіс-провайдері логує всі запити з часом, toSql() на білдері дає запит із плейсхолдерами, toRawSql() з PHP 8 і Laravel 10+ підставляє значення. Для продакшену краще slow query log бази, а не логування всього.
У лапках навколо ідентифікаторів (зворотні в MySQL, подвійні в PostgreSQL), у деяких ключових словах і функціях, у синтаксисі LIMIT і повернення значень. Вибір діалекту впливає на те, що форматер вважає ключовим словом і як ділить рядки.