Как получить запрос, выполненный в Laravel 5? DB:: getQueryLog возвращает пустой массив
Я пытаюсь просмотреть журнал для запроса, но DB::getQueryLog()
просто возвращает пустой массив:
$user = User::find(5);
print_r(DB::getQueryLog());
результат:
Array
(
)
как я могу просмотреть журнал для этого запроса?
9 ответов:
по умолчанию журнал запросов отключен в Laravel 5: https://github.com/laravel/framework/commit/e0abfe5c49d225567cb4dfd56df9ef05cc297448
вам нужно будет включить журнал запросов, позвонив:
DB::enableQueryLog();
или зарегистрировать прослушиватель события:
DB::listen( function ($sql, $bindings, $time) { // $sql - select * from `ncv_users` where `ncv_users`.`id` = ? limit 1 // $bindings - [5] // $time(in milliseconds) - 0.38 } );
Советы
1. Несколько соединений с БД
если у вас есть более одного подключения к БД, вы должны указать, какое подключение журнал
чтобы включить журнал запросов для
my_connection
:DB::connection('my_connection')->enableQueryLog();
чтобы получить журнал запросов
my_connection
:print_r( DB::connection('my_connection')->getQueryLog() );
2. Где включить журнал запросов ?
для жизненного цикла HTTP-запроса вы можете включить журнал запросов в
handle
методBeforeAnyDbQueryMiddleware
middleware а затем получить выполненные запросы вterminate
метод того же промежуточного программного обеспечения.class BeforeAnyDbQueryMiddleware { public function handle($request, Closure $next) { DB::enableQueryLog(); return $next($request); } public function terminate($request, $response) { // Store or dump the log data... dd( DB::getQueryLog() ); } }
цепочка промежуточного программного обеспечения не будет работать команды artisan, поэтому для выполнения CLI вы можете включить журнал запросов в
artisan.start
прослушивателя событий.например, вы можете поместить его в
bootstrap/app.php
file$app['events']->listen('artisan.start', function(){ \DB::enableQueryLog(); });
3. Память
Laravel сохраняет все запросы в памяти. Поэтому в некоторых случаях, например, при вставке большого количества строк или при длительном выполнении задания с большим количеством запросов, это может привести к тому, что приложение будет использовать избыточную память.
в большинстве случаев вам понадобится только лог запросов для отладки, и если это так, я бы рекомендовал вам включить его только для разработки.
if (App::environment('local')) { // The environment is local DB::enableQueryLog(); }
ссылки
если тебя волнует-это фактический запрос (последний запуск) для быстрой отладки:
DB::enableQueryLog(); # your laravel query builder goes here $laQuery = DB::getQueryLog(); $lcWhatYouWant = $laQuery[0]['query']; # <------- # optionally disable the query log: DB::disableQueryLog();
сделать
print_r()
on$laQuery[0]
чтобы получить полный запрос, включая привязки. (тег$lcWhatYouWant
переменная выше будет иметь переменные заменены на??
)если вы используете что-то другое, чем основное соединение mysql, вам нужно будет использовать их вместо этого:
DB::connection("mysql2")->enableQueryLog();
DB::connection("mysql2")->getQueryLog();
(С вашим именем подключения где "mysql2")
видимо с Laravel 5.2, закрытие в
DB::listen
получает только один параметр.Итак, если вы хотите использовать
DB::listen
в Laravel 5.2, вы должны сделать что-то вроде:DB::listen( function ($sql) { // $sql is an object with the properties: // sql: The query // bindings: the sql query variables // time: The execution time for the query // connectionName: The name of the connection // To save the executed queries to file: // Process the sql and the bindings: foreach ($sql->bindings as $i => $binding) { if ($binding instanceof \DateTime) { $sql->bindings[$i] = $binding->format('\'Y-m-d H:i:s\''); } else { if (is_string($binding)) { $sql->bindings[$i] = "'$binding'"; } } } // Insert bindings into query $query = str_replace(array('%', '?'), array('%%', '%s'), $sql->sql); $query = vsprintf($query, $sql->bindings); // Save the query to file $logFile = fopen( storage_path('logs' . DIRECTORY_SEPARATOR . date('Y-m-d') . '_query.log'), 'a+' ); fwrite($logFile, date('Y-m-d H:i:s') . ': ' . $query . PHP_EOL); fclose($logFile); } );
сначала нужно включить ведение журнала запросов
DB::enableQueryLog();
было бы лучше, если бы вы включили ведение журнала запросов до запуска приложения, что вы можете сделать в BeforeMiddleware, а затем получить выполненные запросы в AfterMiddleware.
поставить на маршруты.файл php:
\Event::listen('Illuminate\Database\Events\QueryExecuted', function ($query) { echo'<pre>'; var_dump($query->sql); var_dump($query->bindings); var_dump($query->time); echo'</pre>'; });
отправлено msurguy, исходный код в на этой странице. Вы найдете этот fix-код для laravel 5.2 в комментариях.
этот код:
- Laravel 5.2
- войти операторы в базу данных mysql
вот код, который основан на ответе @milz:
DB::listen(function($sql) { $LOG_TABLE_NAME = 'log'; foreach ($sql->bindings as $i => $binding) { if ($binding instanceof \DateTime) { $sql->bindings[$i] = $binding->format('\'Y-m-d H:i:s\''); } else { if (is_string($binding)) { $sql->bindings[$i] = "'$binding'"; } } } // Insert bindings into query $query = str_replace(array('%', '?'), array('%%', '%s'), $sql->sql); $query = vsprintf($query, $sql->bindings); if(stripos($query, 'insert into `'.$LOG_TABLE_NAME.'`')===false){ $toLog = new LogModel(); $toLog->uId = 100; $toLog->sql = $query; $toLog->save(); } });
ядро
if(stripos...
строка, которая предотвращает рекурсию вставкиinsert into log
оператор SQL в базу данных.
В продолжение по-видимому, с Laravel 5.2 закрытие в DB:: listen получает только один параметр... ответ выше : вы можете поместить этот код в скрипт middleware и использовать его в стороны.
дополнительно:
use Monolog\Logger; use Monolog\Handler\StreamHandler; $log = new Logger('sql'); $log->pushHandler(new StreamHandler(storage_path().'/logs/sql-' . date('Y-m-d') . '.log', Logger::INFO)); // add records to the log $log->addInfo($query, $data);
(Laravel 5.2) я считаю, что самый простой способ-это просто добавить одну строку кода для мониторинга sql-запросов:
\DB::listen(function($sql) {var_dump($sql); });
для laravel 5 и далее, используя только DB:: getQueryLog() , не будет делать. По умолчанию в этом значение
protected $loggingQueries = false;
изменить на
protected $loggingQueries = true;
в приведенном ниже файле для регистрации запроса. /поставщика/фреймворк Laravel/рамках/в src/освещения/базы данных/связи.РНР И тогда мы можем использовать DB:: getQueryLog (), где вы хотите распечатать запрос.