laravel 框架打印完整sql语句

4,705 阅读1分钟

在laravel 中使用ORM 写SQL查询时,确实写起来很快,但是当我们写复杂查询或者优化SQL时,为了心里有底,基本会想去打印laravel执行后的原始sql语句

laravel 中打印语句有一些三种方式

  1. 讨巧的方式,SQL语句故意写错,运行后查询laravel的报错信息中,这种方式只可看到sql执行的第一条语句

  2. 原生打印: sql语句和参数是分开的

     DB::connection()->enableQueryLog();
     User::query()->where(['id' => 1])->first();
     dd( DB::getQueryLog());
    

返回

array:1 [ 0 => array:3 [ "query" => "select * from user where (id = ?) limit 1" "bindings" => array:1 [ 0 => 1 ] "time" => 123.48 ] ] 3. 在2的基础上进一步处理

在 App\Providers\AppServiceProvider 文件中的boot函数添加如下内容 (local环境)

    if (config('app.env') === 'local') {
        DB::listen(function ($query) {
            $sql = array_reduce($query->bindings, function($sql, $binding) {
                return preg_replace('/\?/', is_numeric($binding) ? $binding : sprintf("'%s'", $binding), $sql, 1);
            }, $query->sql);

            Log::info($sql);
        });
    }

运行涉及SQL的接口时即可在日志中查看完整的sql语句

[2020-11-05 22:45:31] local.INFO: select * from `user` where `user_id` = 3