I'm trying to view the log for a query, but DB::getQueryLog()
is just returning an empty array:
$user = User::find(5);
print_r(DB::getQueryLog());
Result
Array
(
)
How can I view the log for this query?
ベストアンサー1
By default, the query log is disabled in Laravel 5: https://github.com/laravel/framework/commit/e0abfe5c49d225567cb4dfd56df9ef05cc297448
You will need to enable the query log by calling:
DB::enableQueryLog();
// and then you can get query log
dd(DB::getQueryLog());
or register an event listener:
DB::listen(
function ($sql, $bindings, $time) {
// $sql - select * from `ncv_users` where `ncv_users`.`id` = ? limit 1
// $bindings - [5]
// $time(in milliseconds) - 0.38
}
);
Some Tips
1. Multiple DB connections
If you have more than one DB connection you must specify which connection to log
To enables query log for my_connection
:
DB::connection('my_connection')->enableQueryLog();
To get query log for my_connection
:
print_r(
DB::connection('my_connection')->getQueryLog()
);
2. Where to enable query log ?
HTTP リクエストのライフサイクルでは、いくつかの `BeforeAnyDbQueryMiddleware` [ミドルウェア][1] の `handle` メソッドでクエリ ログを有効にし、同じミドルウェアの [`terminate`][2] メソッドで実行されたクエリを取得できます。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
ファイルに入れることができます
$app['events']->listen('artisan.start', function(){
\DB::enableQueryLog();
});
3. 記憶
Laravel はすべてのクエリをメモリ内に保持します。そのため、多数の行を挿入する場合や、多数のクエリを含む長時間実行されるジョブがある場合など、場合によっては、アプリケーションが過剰なメモリを使用する可能性があります。
ほとんどの場合、クエリ ログはデバッグにのみ必要になります。その場合は、開発時にのみ有効にすることをお勧めします。
if (App::environment('local')) {
// The environment is local
DB::enableQueryLog();
}
参考文献