专栏首页程序员小助手3分钟短文 | Laravel 获取模型查询生成的SQL语句

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

引言

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

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

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

学习时间

比如有一个原始的查询:

DB::table('users')->get();

它生成的SQL语句是

SELECT * FROM users

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

DB::enableQueryLog();
dd(DB::getQueryLog());

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

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

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

DB::table('users')->toSql()

上述方法输出的结果:

select * from `users`

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

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

$query = \DB::table('users')->where('id', 10);
$sql = str_replace_array('?', $query->getBindings(), $query->toSql());
dd($sql);

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

本文分享自微信公众号 - 程序员小助手(mql45ea),作者:黄门小李子

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-08-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 3分钟短文:Laravel查询构造器,告别手写SQL的艰苦岁月

    鉴于上一章标题引起一些开发同学的巨大兴趣,本文我们接着此种行文方式继续我们的“Laravel宇宙”系列文章。 我们在前一些章节,相继使用迁移创建了数据库结构,使...

    程序员小助手
  • 3分钟短文:Laravel 使用DB门面操作原生SQL

    我们推荐使用laravel的eloquent orm 模型操作数据库表, 因为特性更为丰富,组装更为灵活,在编程层面操作数据的来来去去非常直观。而有些场景不可避...

    程序员小助手
  • 3分钟短文 | Laravel 日志全程记录 SQL 查询语句,要改写底层?

    Laravel 提供给了比较强大的ORM数据库操作方式,如果在数据库端考虑到性能问题, 难以打开MySQL的慢日志,或者出于审计考虑,要在系统内全程跟踪所有的S...

    程序员小助手
  • T-SQL基础(六)之可编程对象

    子查询返回的值不止一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。

    雪飞鸿
  • 【程序猿硬核科普】学习使用Markdown语法写博客

    Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,在 2004 由约翰·格鲁伯(英语:John Gruber)创建。Markd...

    浩Coding
  • 大数据技术之_06_Zookeeper学习_Zookeeper入门+Zookeeper安装+Zookeeper内部原理+Zookeeper实战(开发重点)+企业面试真题

      Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目。

    黑泽君
  • 不要只关注主播月入百万,直播的这个价值比钱重要一百倍!

    今天有一张“互联网平台头部用户收入调查”截图,在朋友圈广为流传,也引发了不小争议,不同平台的收入与许多人主观印象不符,其中头部用户收入最高的平台是快手,月收入7...

    罗超频道
  • Django 解决跨域问题(写入到中间件中)

    阿强Wwlt
  • 史上最全python面试题详解(三)

    一般情况下,单独写一个def func():表示一个函数,如果写在类里面是一个方法。但是不完全准确。

    py3study
  • 房间又乱了?日本机器人替你整理好,东西不见了它也能找到 | 女仆の温柔

    不过,里面的深度学习算法,是出自名叫Preferred Networks的日本团队。

    量子位

扫码关注云+社区

领取腾讯云代金券