PHP Laravel:確認已執行的SQL內容的方法

Table of Contents

Table of Contents

在開發Laravel應用的過程,或是尋找錯誤原因時,常常會需要檢查操作資料的SQL是否執行正確,到底是什麼樣的SQL被執行等狀況。
本文將介紹三種方法來確認已執行的SQL內容。

教學影片

方法1: 使用QueryBuilder的toSql()跟getBindings()

使用toSql()可以取得QueryBuilder的SQL,但參數的部分會是 ? 符號。因此要取得參數需要使用getBinding()才能拿到真正的值。

$query = DB::table('samples')->where('id', '>', '5');
dump($query->toSql());
dump($query->getBindings());

dump結果如下:

^ "select * from `samples` where `id` > ?"

^ array:1 [▼
  0 => "5"
]

透過使用preg_replace_array方法可以取得完整的樣貌。

dump(preg_replace_array('/\?/', $query->getBindings(), $query->toSql())); // method 1

方法2: 使用DB::enableQueryLog()跟DB::getQueryLog()

先設定DB::enableQueryLog()來啟動log功能將執行過後的SQL內容儲存,然後再用DB::getQueryLog()取得已儲存的內容。
注意要先執行SQL後才會產生log。

DB::enableQueryLog();
$query = DB::table('samples')->where('id', '>', '5');
$samples = $query->get();
dump(DB::getQueryLog());

方法3: 使用Laravel官方套件Telescope

Telescope是Laravel官方提供的一項便利工具,可以用來查看request, exceptions, log entries, database queries, queued jobs, mail, notifications, cache operations, scheduled tasks, variable dumps等等。
是開發或偵錯時很強力的幫手。使用它時需要先安裝套件,並且調整設定與環境。

Install

composer require laravel/telescope --dev

php artisan telescope:install

Settings

執行migrate。

php artisan migrate

刪除config/app.php設定檔案中的TelescopeServiceProvider

App\Providers\AppServiceProvider中加入本地環境的設定。

/**
 * Register any application services.
 *
 * @return void
 */
public function register()
{
    if ($this->app->environment('local')) {
        $this->app->register(\Laravel\Telescope\TelescopeServiceProvider::class);
        $this->app->register(TelescopeServiceProvider::class);
    }
}

composer.json中追加以下設定。

"extra": {
    "laravel": {
        "dont-discover": [
            "laravel/telescope"
        ]
    }
},

Telescope管理畫面

用瀏覽器開啟telescope管理畫面:http://localhost:4010/telescope/
(localhost:4041為本地應用的網域名稱與端口。)

移動至http://localhost:4010/telescope/queries
可以看到如下圖這般顯示出已執行的SQL內容。

telescope