laravel 获取完整sql 带参数

时间:2025-03-04 07:04:35

在laravel中我们常常需要记录执行sql以便完成日志记录和监控,laravel有几种方法可以实现,我记录在这里,供大家参考

1使用toSql

DB::table('user')->where('id', 1)->toSql();

但是获取的sql是没有绑定参数的,参数都用?代替了,我们这里使用了

利用 builder 的 getBindings 方法:

$builder = DB::table('user')->where('id', 1);
$bindings = $builder->getBindings();
$bindings = array_map(function($a){
            return '\''.$a.'\'';
        },$bindings );
$sql = str_replace('?', '%s', $builder->toSql());
$sql = sprintf($sql, ...$bindings);
dd($sql);

这样可以得到带有参数的sql,我在原来基础上对参数添加了引号,看起来可以更完整,注意该方法只适用于查询语句,增删改请使用下面的方法

2使用 getQueryLog(推荐!!)

 //开启日志
        DB::connection()->enableQueryLog();
//执行你的sql
//重组sql
$bindings = DB::getQueryLog();

        $data = [];
        foreach ($bindings as $k=> $b){

            $bi  = $b['bindings'];

            $bi = array_map(function($a){
                return '\''.$a.'\'';
            },$bi);

            $sql = str_replace('?', '%s', $b['query']);
            $sql2 = sprintf($sql, ...$bi);

            $data[$k] = $sql2;
        }

        return implode(';',$data);

于前面的区别则是可以捕获单次内存执行的全部语句,包括增删改查,非常方便,推荐使用!

3使用listen方法

项目的App\Providers下拥有

AppServiceProvider类

在该类里的boot方法里可以监听任意位置执行的sql,捕获执行的参数

public function boot()
{
DB::listen(function ($query) {
// $query->sql//获取sql
// $query->bindings//获取和sql关联的绑定参数
// $query->time
});
}

第三种有兴趣大家可以自行研究,后面如果我有空也会补充,如果写的有疏忽,还请指出,我会改正,共同进步!

参考文章地址

/eleven24/p/