Laravel 中輸出 SQL 語句的到 log 日誌

jaak發表於2017-08-23

在AppServiceProvider.php中的boot方法中新增如下程式碼 即可

public function boot()
{
    \DB::listen(function($query) {
        $tmp = str_replace('?', '"'.'%s'.'"', $query->sql);
        $tmp = vsprintf($tmp, $query->bindings);
        $tmp = str_replace("\\","",$tmp);
         \Log::info(' execution time: '.$query->time.'ms; '.$tmp."\n\n\t");

      });
}

執行原生 SQL 查詢 使用 ? 繫結引數時上邊是可行的 但是使用命名繫結引數時引數沒有填充到語句中

下邊的解決了使用命名繫結 引數沒有填充到sql語句的問題

            \DB::listen(function ($query) {
                $tmp = str_replace('?', '"'.'%s'.'"', $query->sql);
                $qBindings = [];
                foreach ($query->bindings as $key => $value) {
                    if (is_numeric($key)) {
                        $qBindings[] = $value;
                    } else {
                        $tmp = str_replace(':'.$key, '"'.$value.'"', $tmp);
                    }
                }
                $tmp = vsprintf($tmp, $qBindings);
                $tmp = str_replace("\\", "", $tmp);
                \Log::info(' execution time: '.$query->time.'ms; '.$tmp."\n\n\t");

            }
        );

執行與資料庫相關的操作會在 storage\logs\laravel.log 檔案中看到記錄執行的sql語句
(5.1版本 請看回復區)

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章