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()); }); 

然后我們在瀏覽器打開 http://www.yousite.com/test-sql 即可看到 $user = User::all(); 所產生的 SQL 了。

[
    {
        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.'['.print_r($param, 1).']'."\r\n",8);
//echo $sql . ", with[" . join(',', $param) ."]</br>";
});

方法三:
調用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, 別忘記引入它們。

解釋一下上面的代碼:

  1. illuminate.query 事件觸發時的參數為兩個:handle($sql, $params), SQL 預處理語句與查詢參數值;
  2. 我們只在開發環境記錄 SQL:env('APP_ENV', 'production') == 'local'
  3. 我們的參數里可能存在日期類型,所以直接記日志會報錯,所以處理一下:$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"



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM