Некоторое время назад мне понадобился инструмент отладки, который мог бы представлять полный, легкий для чтения, копируемый / вставляемый SQL.В то время я использовал его для демонстрации ленивых нагрузок N + 1, которые снижали производительность.Поэтому я на самом деле проанализировал DebugBar, чтобы выяснить, как им это удалось, и придумал что-то, что звучало бы так, как будто оно подходит и вашим целям.
Это в основном просто переформатирует то, что Laravel ловит в журнале запросов.(Конечно, они действительно должны завершить выполнение, чтобы быть видимыми здесь.) Просто убедитесь, что, если вы используете какой-либо из методов raw
, инкапсулированные имена полей в обратных галочках, или заглавные буквы будут выглядеть немного странно.
DB::enableQueryLog();
DB::flushQueryLog();
//Execute whatever code results in SQL queries
$queries = DB::getQueryLog();
DB::disableQueryLog();
DB::flushQueryLog();
$dbName = null;
$compiled = [];
foreach ($queries as $query) {
if (DB::getDatabaseName() != $useDb) {
$dbName = DB::getDatabaseName();
$compiled[] = "USE `$dbName`;";
}
$sql = $query['query'];
$values = $query['bindings'];
$enclosures = [
'back_tick' => '`',
'apostrophe' => "'"
];
$matches = [];
foreach ($enclosures as $name => $enclosure) {
$matches[$name] = [];
preg_match_all("/$enclosure.*?$enclosure/", $sql, $matches[$name]);
$matches[$name] = array_last($matches[$name]);
$sql = preg_replace("/$enclosure.*?$enclosure/", "$enclosure?$enclosure", $sql);
}
$sql = strtoupper($sql);
foreach ($enclosures as $name => $enclosure) {
$sql = str_replace_array("$enclosure?$enclosure", $matches[$name], $sql);
}
$values = array_map(function ($value) {
if (!is_numeric($value) && !is_null($value)) {
$value = DB::connection()->getPdo()->quote($value);
}
return $value;
}, $values);
$sql = str_replace_array('?', $values, $sql);
$sql = rtrim($sql, ';').';';
$compiled[] = $sql;
}
Кстати, DB::getQueryLog()
также включает время, необходимое для выполнения запроса, что делает его еще более полезным для диагностики проблем производительности.Просто имейте в виду, время соединения является фактором.Локальное размещение вашего приложения с удаленным доступом к базе данных займет больше времени, чем когда ваш проект фактически запущен.