要查看 laravel eloquent 模型执行的原始 sql,需通过数据库连接层捕获:方法一用 db::enablequerylog() 临时记录查询日志;方法二用 db::listen() 实时监听并拼接真实 sql;方法三用 telescope 可视化查看;均需注意作用域、环境限制及安全风险。

要看到 Laravel Eloquent 模型最终执行的原始 SQL,核心是捕获它底层通过 Query Builder 发出的语句。Eloquent 本身不直接暴露 SQL,但所有查询都会经过数据库连接层,因此有几种可靠方式可获取真实执行语句。
方法一:在请求中临时启用查询日志
适合快速验证某段控制器或服务代码发出的 SQL,操作简单、即插即用。
- 必须在执行查询之前调用
DB::enableQueryLog() - Eloquent 查询(如
User::where('age', '>', 18)->get())会被完整记录 - 查询执行后,立即用
DB::getQueryLog()获取数组,每项含query(带 ? 占位符)、bindings(参数值)、time(毫秒) - 注意:
toSql()只返回预编译 SQL(不含参数),且对with()关联加载等多查询场景无效,不能替代日志
方法二:使用 DB::listen() 实时监听所有查询
推荐用于开发环境长期观察,尤其适合 Artisan 命令、API 调试或定位 N+1 问题。
- 需在
AppServiceProvider::boot()中注册监听器,确保生效时机正确 - 要求
APP_DEBUG=true,否则监听逻辑可能被跳过 - 回调函数中可手动拼接真实 SQL:
vsprintf(str_replace('?', '%s', $query->sql), $query->bindings) - 建议写入日志文件而非
dump()或echo,避免 CLI/HTTP 环境输出不可见
方法三:配合 Telescope 查看可视化日志
适合本地开发调试,提供界面化、可筛选、带上下文的 SQL 查看体验。
- 仅限
local环境安装启用,生产环境禁用 - 自动捕获全部查询、绑定参数、执行时间、调用栈(可点开溯源)
- 对高频请求或大量日志较敏感,可能影响响应速度和存储体积
- 不依赖手动插桩,零代码修改即可启用
注意事项与避坑点
有些常见误区会导致看不到 SQL 或结果失真,需特别留意:
-
DB::enableQueryLog()对当前请求生命周期有效,中间件、命令、队列任务中需各自启用 - 原生 PDO 操作(如直连
new PDO())或未走DB门面的调用,不会被记录 -
bindings中的null会显示为NULL字符串,字符串值默认无引号,拼接真实 SQL 时需自行处理格式 - 生产环境严禁开启任何 SQL 日志功能,存在性能损耗和敏感数据泄露风险











