侧边栏壁纸
博主头像
云BLOG 博主等级

行动起来,活在当下

  • 累计撰写 318 篇文章
  • 累计创建 6 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

在 ThinkPHP 8 中,除了 getLastSql(),还有以下几种获取SQL语句的方法:

Administrator
2025-11-29 / 0 评论 / 0 点赞 / 3 阅读 / 0 字
在 ThinkPHP 8 中,除了 getLastSql(),还有以下几种获取SQL语句的方法:

1. getLastSql() - 获取最后执行的SQL
php
12
Db::name('user')->where('id', 1)->find();
echo Db::getLastSql(); // SELECT * FROM `user` WHERE `id` = 1
2. fetchSql() - 预览SQL但不执行
php
1234567
// 方式1:链式调用
$sql = Db::name('user')->where('id', 1)->fetchSql(true)->select();
echo $sql; // SELECT * FROM `user` WHERE `id` = 1

// 方式2:先设置再执行
$query = Db::name('user')->where('id', 1)->fetchSql(true);
$sql = $query->select();
3. buildSql() - 构建SQL字符串
php
12
$sql = Db::name('user')->where('id', 1)->buildSql();
echo $sql; // (SELECT * FROM `user` WHERE `id` = 1)
4. getOptions() - 获取查询配置
php
123
$query = Db::name('user')->where('id', 1);
$options = $query->getOptions();
print_r($options); // 显示查询的各个配置项
5. __toString() - 直接输出SQL
php
12
$sql = (string)Db::name('user')->where('id', 1);
echo $sql; // SELECT * FROM `user` WHERE `id` = 1
6. 调试模式下的SQL日志
php
123456
// 开启调试模式,在日志中查看所有SQL
// 配置文件中设置
'debug' => true,
'log' => [
    'record_trace' => true,
],
7. 事件监听SQL执行
php
1234
// 监听SQL执行事件
Event::listen('SqlExecute', function($sql, $runtime) {
    echo "执行SQL: " . $sql . ",耗时:" . $runtime . "s\n";
});
实际应用对比:
php
123456789101112131415
// 1. 获取最后执行的SQL(实际执行后)
Db::name('user')->where('id', 1)->find();
echo Db::getLastSql();

// 2. 预览SQL(不执行)
$sql = Db::name('user')->where('id', 1)->fetchSql(true)->select();
echo $sql;

// 3. 构建SQL字符串(不执行)
$sql = Db::name('user')->where('id', 1)->buildSql();

在您的代码中,最合适的调试方法是使用 buildSql() 或直接删除那行调试代码,因为 fetchSql(true)->select() 会执行两次查询造成性能浪费。

0

评论区