在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/