在laravel 中使用ORM 写SQL查询时,确实写起来很快,但是当我们写复杂查询或者优化SQL时,为了心里有底,基本会想去打印laravel执行后的原始sql语句
laravel 中打印语句有一些三种方式
-
讨巧的方式,SQL语句故意写错,运行后查询laravel的报错信息中,这种方式只可看到sql执行的第一条语句
-
原生打印: 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