How to Get the Query Executed in Laravel 5? DB::getQueryLog() Returning Empty Array Ask Question

How to Get the Query Executed in Laravel 5? DB::getQueryLog() Returning Empty Array Ask Question

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();
}

参考文献

おすすめ記事