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 于 5年前 加精
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 11

试了一下确实不错哦

5年前 评论

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

5年前 评论
蜗牛

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

file

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

5年前 评论

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

DB::enableQueryLog();

// Your Code

dd(DB::getQueryLog());
5年前 评论

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

5年前 评论

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

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

5年前 评论
 ` 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}();

5年前 评论

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

5年前 评论

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

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

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

4年前 评论

这个只能 5.2 以上使用吧?

3年前 评论

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