1. 程式人生 > >laravel檢視sql語句

laravel檢視sql語句

方法一:

我們有時候想測試一段程式碼生產的 SQL 語句,比如: 我們想看 App\User::all(); 產生的 SQL 語句,我們簡單在 routes.php 做個實驗即可:

//app/Http/routes.php

Route::get(‘/test-sql’, function() {

DB::enableQueryLog();

$user = App\User::all();

return response()->json(DB::getQueryLog());

[
{
query: “select * from users where users

.deleted_at is null”,
bindings: [ ],
time: 1.37
}
]

方法二:

在routes.php新增如下程式碼

Event::listen(‘illuminate.query’, function(sql,param) {
file_put_contents(public_path().’/sql.log’,sql.[.printr(param, 1).’]’.”\r\n”,8);
//echo sql.",with[".join(,,param) .”]“;
});

方法三:
呼叫vendor\laravel\framework\src\Illuminate\Database\Query的toSql方法:
$query->toSql();
方法四:
使用監聽器

第一步:建立監聽器

php artisan make:listener QueryListener –event=illuminate.query
生成檔案於 app/Listeners/QueryListener.php

然後刪除 app/Listeners/QueryListener.php 頂部的 use App\Events\illuminate.query;, 這是自動生成的。

第二步:註冊事件

開啟 app/Providers/EventServiceProvider.php,在 $listen 中新增 illuminate.query 事件的監聽器為 QueryListener:

protected $listen = [
‘illuminate.query’ => [
QueryListener::class,
],
];
當然在類前面你需要 use App\Listeners\QueryListener; 不然就報類不存在了。

第三步:新增邏輯

修改上面生成的檔案,我們把 SQL 查詢記錄到日誌裡,所以編輯 handle 方法為:

/**
 * Handle the event.
 *
 * @param  Events  $event
 * @return void
 */
public function handle($sql, $params)
{
    if (env('APP_ENV', 'production') == 'local') {
        foreach ($params as $index => $param) {
            if ($param instanceof DateTime) {
                $params[$index] = $param->format('Y-m-d H:i:s');
            }
        }
        $sql = str_replace("?", "'%s'", $sql);
        array_unshift($params, $sql);
        Log::info(call_user_func_array('sprintf', $params));
    }
}

上面我們用到了兩個類:Log 與 DateTime, 別忘記引入它們。

解釋一下上面的程式碼:

illuminate.query 事件觸發時的引數為兩個:handle(sql,params), SQL 預處理語句與查詢引數值;
我們只在開發環境記錄 SQL:env(‘APP_ENV’, ‘production’) == ‘local’;
我們的引數裡可能存在日期型別,所以直接記日誌會報錯,所以處理一下:$param instanceof DateTime;
然後跑一下試試吧,應該在日誌裡就能看到:

[2015-07-10 02:45:39] local.INFO: update tricks set view_cache = “10”, updated_at = “2015-07-10 02:45:39” where id = “2”