方法一:php
咱們有時候想測試一段代碼生產的 SQL 語句,好比: 咱們想看 App\User::all(); 產生的 SQL 語句,咱們簡單在 routes.php 作個實驗便可:laravel
//app/Http/routes.phpsql
Route::get(‘/test-sql’, function() {json
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
}
]app
方法二:ide
在routes.php添加以下代碼測試
Event::listen(‘illuminate.query’, function(sql,sql,param) {
file_put_contents(public_path().’/sql.log’,sql.′[′.printr(sql.′[′.printr(param, 1).’]’.」\r\n」,8);
//echo sql.",with[".join(′,′,sql.",with[".join(′,′,param) .」]「;
});spa
方法三:
調用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,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」