Laravel 中调试输出 SQL 语句的简便方法
Elequent ORM ->toSql() 可以输出sql语句,但如果带 binding 参数的,输出的语句会带?,类似下面这样:
select * from `rooms` where `rooms`.`project_id` = ?
barryvdh/laravel-debugbar 这个包需要添加代码注入配置,仅限浏览器输出,如果是 postman 工具调试,就无法查看输出的SQL了。
简便方法
可以把下面代码放在查询语句前:
\DB::listen(function($sql, $bindings, $time) {
foreach ($bindings as $replace){
$value = is_numeric($replace) ? $replace : "'".$replace."'";
$sql = preg_replace('/\?/', $value, $sql, 1);
}
dd($sql);
})
本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由 Summer
于 8年前 加精
关于 LearnKu
高认可度评论:
laravel打印执行的Sql语句
laravel打印执行的Sql语句
试了一下确实不错哦
@叶落山城 我们也是用Log查看SQL语句
在
Illuminate\Database\Query\Builder的runSelect()return 之前 dd($this->toSql());这是我以前做的方法,现在学到了。:smile:
比较喜欢用下面这种方法调试,觉得比
DB::listen的方案灵活一些。@NauxLiu 恩,我开始也是你这个方法,你这个输出是sql 和 binding 数据分离的,也就是想拼凑一条完整sql 还要手动,不太方便。另外还有个缺点就是只能输出查询语句,insert,update 等就不行了。
可以给 api 请求加一个 middleware, 把 debugbar 的数据输出,ProfileJsonResponse .
设置 debugbar 配置的
db.with_params为 true 就可以把 sql 语句中的 ? 替换为参数值新手测试代码,报错了请教
@悲剧不上演 你这个错误和 我本文的数据库调试问题应该不贴边。
看下你的 GoodsController 对应的路由,routes.php里面, 第二个参数不匹配,是不是丢了。
@扣丁禅师
@悲剧不上演
有的版本中\DB::listen(function($sql) {}中的$sql 已经包含binding,time, sql这三种信息。
具体想要怎么调配,就按照正则去处理下即可。
这个只能 5.2 以上使用吧?