在laravel中使用eloquent orm查詢數據庫是‘場常見的事情,但是當我們面對一些複雜的查詢需求時,需要通過查看執行的sql語句來進行調試,那么如何打印執行的sql語句呢?
Laravel提供了兩種方式來打印執行的SQL語句,一種是通過日志輸出,一種是通過事件監聽器打印。
通過日志輸出
Laravel中通過日志輸出執行的SQL語句是最方便的一種方式,在每個環境中都有相應的日志記錄和查看方式。
我們可以在配置文件中打開SQL語句的日志記錄:
// 在config/database.php文件中,找到default下的connections數組,增加以下選項: 'log_queries' => true, // 開啟SQL日志記錄 'log_channel' => 'daily', // 日志存儲方式,也可使用syslog、errorlog等方式 'log_level' => 'debug', // 日志級別
增加log_queries選項后,Laravel會自動記錄執行的SQL語句,日志會輸出到storage/logs目錄下。
在代碼中執行查詢語句后,我們可以通過下面的方式來輸出SQL語句:
DB::enableQueryLog(); // 執行查詢語句 $users = DB::table('users')->get(); // 獲取執行的SQL語句 $sql = DB::getQueryLog()[0]['query'];
在上面代碼中,首先調用DB::enableQueryLog()方法開啟記錄SQL語句,在執行查詢后,可以通過DB::getQueryLog()方法獲取所有已執行的SQL語句,如果要獲取最后一條SQL語句,也可使用DB::getLastQuery()方法。
但需要注意的是,使用此方式在生產環境中記錄大量的SQL語句將會導致日志體積增大,不利于系統的維護和排查問題,因此不要在生產環境中頻繁記錄SQL語句的日志。
通過事件監聽器
Laravel提供了監聽SQL執行事件的方式,開發者可以通過監聽SQL執行事件來輸出SQL語句,這種方式更加安全可靠,不會在生產環境中產生大量的日志。
通過定義監聽器,在執行任意查詢語句時都可以打印出相應的SQL語句。下面是實現代碼:
// 在AppServiceProvider的boot方法中,添加以下代碼 use IlluminateSupportFacadesDB; use IlluminateDatabaseEventsQueryExecuted; use Log; // 注冊SQL執行監聽器 DB::listen(function (QueryExecuted $queryExecuted) { $sql = str_replace("?", "'%s'", $queryExecuted->sql); $bindings = $queryExecuted->connection->prepareBindings($queryExecuted->bindings); $fullSql = vsprintf($sql, $bindings); Log::debug('SQL:'.$fullSql); });
在上述代碼中,我們用DB::listen()注冊一個事件監聽器,當任何查詢語句執行時都會被觸發。
在監聽器中通過 QueryExecuted 事件獲取到當前查詢的 SQL 語句以及相關綁定參數等信息,然后通過 Log::debug() 方法輸出到日志中。
通過上述兩種方式,我們實現了在Laravel中打印SQL語句的目的,可以更方便地進行調試和排查問題,在開發中起到不可替代的作用。