Laravel 记录与打印 SQL 语句的两种常用方法

拾柒
拾柒
发布时间:2026-10-13 | 3人浏览过
原创

在 Laravel 项目开发过程中,排查数据库相关问题时往往需要查看实际执行的 SQL 语句。本文将介绍两种直接在代码层面实现 SQL 语句打印与记录的方法,涵盖单次查询提取与全局事件监听两种方式。

结果或目标

为了快速定位数据库操作中的语法错误或性能瓶颈,我们需要在 PHP 脚本运行时捕获 Laravel 框架底层构建及执行的 SQL 语句,并以人类可读的格式(参数已替换)或原始结构打印出来。

准备条件

  • Laravel 项目环境(以较新版本为基准,API 路径可能因版本略有差异)。
  • 基本的 PHP 代码编写能力。
  • 能够访问代码文件(如 routes.php 或具体的控制器/服务提供者)。

真实操作顺序

第1步:通过 API 提取并格式化最近一次查询

目的:适用于需要在特定代码块执行完毕后,立即查看刚产生的那条 SQL 语句的场景,便于精准定位某段业务逻辑。

入口:在你的控制器、服务类或临时测试文件中,紧接在执行了数据库操作(如 Eloquent 查询或 DB 构造器)的代码之后。

动作:利用 DB Facade 提供的日志记录功能。首先调用 getQueryLog() 获取最近的查询日志数组,然后取出最后一条记录,并利用 vsprintf 将 bindings(绑定参数)填入 SQL 占位符中,从而还原完整的 SQL 语句。

关键代码示例如下:

$queries = DB::getQueryLog();
// 获取最后一条记录的详细信息
$last_query = end($queries);
if ($last_query) {
    // 替换问号占位符
    $sql = str_replace('?', '"'.'%s'.'"', $last_query['query']);
    echo vsprintf($sql, $last_query['bindings']);
}

完成状态:屏幕输出类似 select * from users where id = "1" 的结果。若无输出,请检查是否存在异常导致日志未写入。

第2步:在路由层监听全局查询事件

目的:适用于希望在整个请求周期内,自动打印所有被触发的 SQL 语句,无需在每处代码手动注入日志逻辑。

入口:Laravel 的核心路由配置文件(旧版为 app/Http/routes.php,新版通常位于 bootstrap/app.php 或单独的服务提供者中)。为确保事件在应用启动早期生效,建议将此监听器放在路由加载之前或启动引导阶段。

动作:注册一个针对 illuminate.query 事件的监听器。当 Laravel 内部发生任何数据库查询时,该事件会被触发,我们可以直接在回调中打印出事件对象携带的 SQL、绑定的参数以及执行耗时。

关键代码示例如下:

use Illuminate\Support\Facades\Event;
use Illuminate\Database\Events\QueryExecuted;

// 监听查询事件
Event::listen(function (QueryExecuted $query) {
    var_dump([
        'sql' => $query->sql,
        'bindings' => $query->bindings,
        'time' => $query->time
    ]);
});

注意:如果在现代 Laravel 版本中找不到 routes.php 中的放置位置,请将其移至 app/Providers/AppServiceProvider.php 的 boot 方法中,或者通过 Artisan 命令生成新的 Service Provider 进行配置。

完成状态:发起页面请求后,浏览器控制台或终端日志中会自动显示当前请求涉及的所有 SQL 信息,无需中断程序流程即可观察。

简要总结

以上就是 Laravel 环境下记录与打印 SQL 语句的详细内容,主要通过直接读取查询日志和监听全局事件两种途径来实现。根据实际需求选择合适的方式,可以有效提升数据库相关的调试效率。更多关于 PHP 与 Laravel 编程技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表