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 !
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 8
felo

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

5年前 评论

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

5年前 评论

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

5年前 评论

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

5年前 评论

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

5年前 评论

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

5年前 评论
ibucoin

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

5年前 评论