前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >3分钟短文 | Laravel 获取模型查询生成的SQL语句

3分钟短文 | Laravel 获取模型查询生成的SQL语句

作者头像
程序员小助手
发布2020-08-10 10:09:44
3.1K0
发布2020-08-10 10:09:44
举报
文章被收录于专栏:程序员小助手

引言

在程序开发阶段,我们关注于业务逻辑,实现功能。而laravel提供了非常好的 debug 支持,只需在 env 文件内指定 debug = true ,就可以在页面打开 debug bar 用于调试。

其中也包含有Query选项,列出了程序加载流程中所有调用的SQL语句,这非常方便。

如果在没有debug,或者没有 blade 模板渲染的页面,如何获取 ORM 组装出来的SQL语句呢?

学习时间

比如有一个原始的查询:

代码语言:javascript
复制
DB::table('users')->get();

它生成的SQL语句是

代码语言:javascript
复制
SELECT * FROM users

那么在程序上下文中,应该如何获取并打印这个SQL语句呢。我们需要使用框架提供的 DB 类的方法:

代码语言:javascript
复制
DB::enableQueryLog();
dd(DB::getQueryLog());

使用enableQueryLog()函数打开SQL记录,然后是正常的数据库逻辑,最后,使用 getQueryLog() 方法获取一个包含了生成的SQL语句,还有绑定的参数。

上述语句打印的结果大致如下:

还有一种方法,就是链式调用 QueryBuilder 的 toSql 方法,即可打印当前模型的SQL语句,而并不执行。

代码语言:javascript
复制
DB::table('users')->toSql()

上述方法输出的结果:

代码语言:javascript
复制
select * from `users`

当然只要是返回的 QueryBuilder 对象,均可使用。所以使用where子句查询后,直接打印较为方便。

但是 toSql 获取的只是带参数绑定的SQL,不打印参数。我们可以这样打印完整的语句:

代码语言:javascript
复制
$query = \DB::table('users')->where('id', 10);
$sql = str_replace_array('?', $query->getBindings(), $query->toSql());
dd($sql);

生成的SQL语句,使用问号作为位置参数,如果想要格式化输出,还可以使用 vsprintf 这个函数:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员小助手 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 学习时间
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档