laravel查看执行的sql语句

方法一: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”

相关文章
相关标签/搜索