趣文网,分享全网好句子、好文章!

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

时间:2023-05-13 02:57:01

相关推荐

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 这个函数:

$query = str_replace(array("?"), array(""%s""), $builder->toSql()); $query = vsprintf($query, $builder->getBindings()); dump($query);

效果与 str_replace_array 是一样的。

再进一步

还有一种思路,就是在 illumination 发起查询的时候,使用事件钩子,打印出SQL语句。有没有这样的钩子呢?laravel自然是有的。

Event::listen("illuminate.query", function($query, $params, $time, $conn) { dd(array($query, $params, $time, $conn));});

其中 illuminate.query 就是查询发起的事件钩子。

效果跟上一节所用方法相同,不再演示。

写在最后

本文通过3种方法打印出程序上下文所生成的SQL语句,可以优化查询的时候,起到很好的作用。

Happy coding :-)

我是 @程序员小助手 ,持续分享编程知识,欢迎关注。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。
显示评论内容(3)
  1. asd10397100272024-01-24 05:30asd1039710027[湖北省网友]183.81.183.237
    写的很清晰,对于初学者来说易于理解,希望能多分享相关的技术文章。
    顶0踩0
  2. 叶敏2023-10-30 20:39叶敏[西藏网友]203.223.8.231
    @ゞ拼湊①個夢看完感觉收获很大,对Laravel的数据库操作又有了更深的理解。
    顶8踩0
  3. ゞ拼湊①個夢2023-08-06 11:48ゞ拼湊①個夢[香港网友]103.38.57.245
    非常实用的技术分享,对于想深入了解Laravel数据库操作的人来说很有帮助。
    顶31踩0
相关阅读
阿里谭继伟:基于序列到序列模型的文本摘要及淘宝的实践

阿里谭继伟:基于序列到序列模型的文本摘要及淘宝的实践

由中国科学院大学主办,百度公司提供支持,读芯术作为指定合作自媒体的AI未来说·青年学术论坛第二期自然语言处理专场已于2019年2月23日下午在中科院举行

2023-05-03

巴伊兰大学:事件新闻推文的交互式摘要生成

巴伊兰大学:事件新闻推文的交互式摘要生成

我们结合几个交互机制,提供了一种子弹式bulletstyle摘要方法,其允许先获取最重要的信息,然后再交互式地深入到具体细节

2023-01-26

基于 Tensorflow eager 的文本生成 注意力 图像注释的完整代码

基于 Tensorflow eager 的文本生成 注意力 图像注释的完整代码

翻译 | 老赵 审核 | 凡江我总是发现生成和序列模型令人着迷:他们提出的问题与我们刚开始学习机器学习时常遇到的问题不同

2023-10-03

Google发布表格文字生成数据集ToTTo

Google发布表格文字生成数据集ToTTo

ToTTo拥有121,000个训练样本,以及7,500个用於开发和测试的样本,Google提到,由於其标注的高精确性,该数据集很适合用来作为,高精确文字生成研究的基准

2023-12-15

CVPR 2019:微软最新提出ObjGAN 输入一句话秒生成图片

CVPR 2019:微软最新提出ObjGAN 输入一句话秒生成图片

不会PS还想做图?可以的!近期,由纽约州立大学奥尔巴尼分校、微软研究院和京东AI研究院合作的一篇文章就可以实现这个需求:只需要输入一句话,就可以生

2023-01-22