thinkphp 8.0中可通过三种方式获取未执行sql:①链式调用中在find/select等执行方法前加->fetchsql(true);②开发环境配置database.php中启用'debug'=>true和'trace_sql'=>true;③使用$query=user::query()->where(...)->buildsql()直接生成带占位符的sql字符串。

调试ThinkPHP 8.0模型查询时,需要确认生成的SQL是否符合预期,但直接看日志或dump结果太绕,必须让模型在不执行的前提下返回原始SQL字符串。
启用 fetch_sql 模式
在模型查询链末尾添加->fetchSql(true),例如 User::where('id', 1)->fetchSql(true)->find();这会让查询构造器跳过执行,只返回SQL语句字符串。
注意:fetchSql(true)必须放在最终执行方法(如find、select、value等)之前,否则无效。放在->order()或->limit()之后仍可生效,但不能写在->select()之后——那已经执行完了。
这一步操作起来很简单,直接把fetchSql(true)加在链式调用的倒数第二位就行。
全局开启 SQL 预览(开发环境专用)
修改项目根目录下的config/database.php文件,在default连接配置中加入:
'debug' => true,
然后在同文件中找到'trace_sql'项,设为true;这两项共同作用后,所有模型查询(包括Db类)都会自动记录SQL到日志,并在页面Trace面板显示。
【开启trace_sql后,生产环境务必设为false,否则暴露完整SQL可能引发安全风险】
用 buildSql() 方法获取未执行SQL
第一步:实例化查询对象,不走静态调用 → $query = User::query();
第二步:拼接条件 → $query->where('status', 1)->where('delete_time', null);
第三步:调用buildSql() → $sql = $query->buildSql();
buildSql()是底层构造器方法,它不依赖fetchSql配置,也不触发任何数据库交互,纯内存拼装,返回带参数占位符的SQL,比如SELECT * FROM `think_user` WHERE `status` = ? AND `delete_time` IS NULL;你拿到的就是最终将被执行的语句骨架。
这个方法适合写单元测试或SQL审计脚本,避免误触真实数据。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











