もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

laravelのクエリログ確認方法知らなかった

はじめに

こんばんは。

laravelのクエリログ確認方法恥ずかしながら Illuminate\Database\Query\Builder\toSQL() しか知らなかったんですが、他の方法をここ最近知りました....w

自分の無知を噛みしめるために備忘録にしておきます。

本題

Illuminate\Support\Facades\DB::enableQueryLog();Illuminate\Support\Facades\DB::getQueryLog() を使うだけです。

public function find()
{
    Illuminate\Support\Facades\DB::enableQueryLog();

    User::find(1);

    dump(Illuminate\Support\Facades\DB::getQueryLog());
}

これだけでOK。

array:1 [
  0 => array:3 [
    "query" => "select * from `users` where `id` = ?"
    "bindings" => array:1 [
      0 => 1
    ]
    "time" => 8.26
  ]

らく〜

最近追加されたのかなとか思ってたら、めちゃめちゃ古くからありました...

恥ずかしい...

ORMでSQLを組み立てるから発行されるSQLを結構確認するタイプなのですが、 今まで頑張って toSQLで確認していたのが馬鹿みたいです...

middleware作ってみた

好きなときだけ クエリログをログに出力して開発したいなと思ったので、middlewareを作ってみました。

<?php

namespace App\Http\Middleware;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;

class QueryLogMiddleware
{
    public function handle(Request $request, \Closure $next, ...$guards)
    {
        if (config('app.debug') === false || config('app.query_log') === false) {
            return $next($request);
        }

        DB::enableQueryLog();

        $response = $next($request);

        $queryLogs  = DB::getQueryLog();
        $queryCount = count($queryLogs);
        if ($queryCount === 0) {
            return $response;
        }

        Log::debug("========== Query Logs Start (count: {$queryCount}) ==========");

        array_map(static function(array $log) {
            $parameter = implode(", ", $log['bindings']);
            Log::debug("{$log['query']}    parameter: [{$parameter}]    time: {$log['time']}");
        }, $queryLogs);

        Log::debug("==========  Query Logs End (count: {$queryCount})  ==========");

        DB::disableQueryLog();

        return $response;
    }
}

ログの結果はこちら

[2022-05-28 00:00:00] local.DEBUG: ========== Query Logs Start (count: 1) ==========  
[2022-05-28 00:00:00] local.DEBUG: select * from `users` where `id` = ?    parameter: [1]    time: 8.26
[2022-05-28 00:00:00] local.DEBUG: ==========  Query Logs End (count: 1)  ==========  

設定で出し分けられるので地味に開発助かります。

でもこれくらいであれば、普通にありそうだけど、ないのかなぁ?

終わりに

これからも無知の知を心がけて恥をかきながら仕事していこうとおもいます。