1. ホーム
  2. php

[解決済み] Laravel5で実行されたクエリを取得する方法とは?DB::getQueryLog()が空の配列を返す

2022-04-24 14:27:51

質問

あるクエリのログを表示しようとしているのですが DB::getQueryLog() は空の配列を返すだけです。

$user = User::find(5);
print_r(DB::getQueryLog());

結果

Array
(
)

このクエリのログを見るにはどうしたらいいですか?

解決方法を教えてください。

Laravel 5では、デフォルトでクエリログが無効になっています。 https://github.com/laravel/framework/commit/e0abfe5c49d225567cb4dfd56df9ef05cc297448

を呼び出して、クエリログを有効にする必要があります。

DB::enableQueryLog();

// and then you can get query log

dd(DB::getQueryLog());

またはイベントリスナーを登録します。

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. 複数のDB接続

複数のDB接続がある場合、どの接続でログを取るかを指定する必要があります。

のクエリログを有効にするには my_connection :

DB::connection('my_connection')->enableQueryLog();

のクエリログを取得するには my_connection :

print_r(
   DB::connection('my_connection')->getQueryLog()
);

2. クエリログを有効にする場所は?

HTTP リクエストのライフサイクルでは、 `BeforeAnyDbQueryMiddleware` [middleware][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();
}

参考文献