Laravel ORM SQL 语句查询、查看,附赠 IDE ORM 语法提示

WIKI 文章已存在相关教程,详见:
Laravel 数据库:输出 SQL 语句

ORM 中 SQL 查询查看

查过很多查询 SQL 的方法,但发现非常多问题:

  • 改起来太麻烦
  • 安装各种插件
  • 好不容易找到代码了,改了之后却发现压根没生效...

所以对于中大型项目来说,最好就是一段代码解决问题。以下方法正好满足上面 2 个问题:

  • 无需安装任何插件,并且 改动幅度小(只需改一个文件)
  • 简单易用,解决后顾之忧~

功能适合于 Laravel 5.5 ~ 5.8 版本

一、修改文件

app/Providers/AppServiceProvider 中的 boot 方法中新增以下代码:

\Illuminate\Database\Query\Builder::macro('sql', function () {
    $bindings = $this->getBindings();
    $sql = str_replace('?','%s',$this->toSql());
    return vsprintf($sql, $bindings);
});
\Illuminate\Database\Eloquent\Builder::macro('sql', function(){
    return ($this->getQuery()->sql());
});

二、使用方式

查询带参数的 SQL 语句可在 ORM 后调用方法

// 正确用法
User::query()->where('id', 1)->sql();

// 错误用法
User::query()->where('id', 1)->get()->sql();
User::query()->where('id', 1)->first()->sql();

三、效果预览

select * from user where id = 1

「帖外话」ORM 的 IDE 函数语法提示

可在模型中新增静态方法 query() ,后续的 where()orderByDesc() 等等相关的 ORM 都能有语法提示。

值得 注意 的是:这里仅仅为了有提示,方便开发者调试、查看相关参数使用方式,但实际上 官方推荐 的写法是不带 query() 的,如: User::where()->get();

User::query()->where('id', 1)->sql();
本作品采用《CC 协议》,转载必须注明作者和本文链接
与优秀的人一起成长! - Grow up with Excellent Peopl !
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 8
felo

5.8版本报错,提示Method Illuminate\Database\Eloquent\Collection::sql does not exist.

4年前 评论

get() 方法执行后返回结果是 Collection 对象了,不是 Builder
要查看 SQL 语句执行情况可以使用超哥的 overtrue/laravel-query-logger 扩展。

4年前 评论

如果是需要查看 SQL 日志,可以看看 博客:Laravel sql 日志记录

4年前 评论

安装 Laravel Telescope
点击 Query
你会发现新世界

4年前 评论

@felo 2楼正解,get()first() 前才可以使用 sql()

4年前 评论

@s51983 这个只支持 5.7+ 版本,对于 5.5 的老用户来说就GG了

4年前 评论
ibucoin

为啥是推荐不带 query()的,我现在基本上都写带query,为了提示。

4年前 评论

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