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 协议》,转载必须注明作者和本文链接
5.8版本报错,提示
Method Illuminate\Database\Eloquent\Collection::sql does not exist.
get()
方法执行后返回结果是Collection
对象了,不是Builder
。要查看 SQL 语句执行情况可以使用超哥的
overtrue/laravel-query-logger
扩展。如果是需要查看
SQL
日志,可以看看 博客:Laravel sql 日志记录安装 Laravel Telescope
点击 Query
你会发现新世界
@felo 2楼正解,
get()
、first()
前才可以使用sql()
@s51983 这个只支持 5.7+ 版本,对于 5.5 的老用户来说就GG了
准备升级到6.0
为啥是推荐不带 query()的,我现在基本上都写带query,为了提示。