Laravel 中调试输出 SQL 语句的简便方法
56

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);
 })

禅师 :while (1) { simpler & faster; }

本帖由 Summer 于 1年前 加精
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 10

试了一下确实不错哦

1年前

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

1年前

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

file

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

1年前

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

DB::enableQueryLog();

// Your Code

dd(DB::getQueryLog());
1年前

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

1年前

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

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

1年前
 ` 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}();

1年前

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

1年前

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

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

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

1年前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!