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 于 6年前 加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 11

比较喜欢用下面这种方法调试,觉得比 DB::listen 的方案灵活一些。

DB::enableQueryLog();

// Your Code

dd(DB::getQueryLog());
6年前 评论
mouyong

Illuminate\Database\Query\BuilderrunSelect() return 之前 dd($this->toSql());

file

这是我以前做的方法,现在学到了。:smile:

6年前 评论

@NauxLiu 恩,我开始也是你这个方法,你这个输出是sql 和 binding 数据分离的,也就是想拼凑一条完整sql 还要手动,不太方便。另外还有个缺点就是只能输出查询语句,insert,update 等就不行了。

6年前 评论

试了一下确实不错哦

6年前 评论

@叶落山城 我们也是用Log查看SQL语句

6年前 评论

可以给 api 请求加一个 middleware, 把 debugbar 的数据输出,ProfileJsonResponse .

设置 debugbar 配置的 db.with_params 为 true 就可以把 sql 语句中的 ? 替换为参数值

6年前 评论
 ` DB::listen(function($sql, $bindings, $time) {
        foreach ($bindings as $replace){
            $value = is_numeric($replace) ? $replace : "'".$replace."'";
            $sql = preg_replace('/\?/', $value, $sql, 1);
        }
        dd($sql);
    });
    Goods::where('name','test')->get();

新手测试代码,报错了请教

Missing argument 2 for App\Http\Controllers\Web\Admin\GoodsController::App\Http\Controllers\Web\Admin{closure}();

6年前 评论

@悲剧不上演 你这个错误和 我本文的数据库调试问题应该不贴边。
看下你的 GoodsController 对应的路由,routes.php里面, 第二个参数不匹配,是不是丢了。

6年前 评论

@扣丁禅师
@悲剧不上演
有的版本中\DB::listen(function($sql) {}中的$sql 已经包含binding,time, sql这三种信息。

\DB::listen(function($sql) {
    $sql->binding;
    $sql->sql;
    $sql->time;
}

具体想要怎么调配,就按照正则去处理下即可。

6年前 评论

这个只能 5.2 以上使用吧?

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!