You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 5中如何获取MySQL原始查询语句?附CodeIgniter参考

Laravel 5 获取原始查询语句的方法

在Laravel 5里,获取可直接用于MySQL测试的原始查询语句有好几种实用方式,我结合平时开发的经验给你整理一下:

1. 直接获取单条查询的SQL结构(不含参数)

不管是用Eloquent模型还是Query Builder构建的查询,都可以用toSql()方法直接拿到带占位符的原始SQL:

// Eloquent示例
$query = App\User::where('id', 1)->toSql();
echo $query; // 输出: select * from `users` where `id` = ?

2. 获取带绑定参数的完整可执行SQL

toSql()只会返回带?占位符的SQL,如果需要直接能在MySQL中运行的完整语句,可以结合getBindings()替换占位符:

$query = App\User::where('id', 1)->where('name', 'John');
$sqlTemplate = str_replace('?', '%s', $query->toSql());
$fullExecutableSql = vsprintf($sqlTemplate, $query->getBindings());
echo $fullExecutableSql; // 输出: select * from `users` where `id` = 1 and `name` = 'John'

3. 全局监听所有数据库查询(调试利器)

如果想监控整个应用执行的所有查询,可以在App\Providers\AppServiceProvider的boot方法里添加查询监听器,每一条执行的SQL都会被捕获:

use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;

public function boot()
{
    DB::listen(function ($query) {
        // 处理成完整可执行SQL
        $fullSql = str_replace('?', '%s', $query->sql);
        $fullSql = vsprintf($fullSql, $query->bindings);
        
        // 可以打印到控制台或者写入日志
        Log::info("执行SQL: {$fullSql},耗时: {$query->time}ms");
    });
}

4. 快速调试:用dd()直接查看查询细节

开发时想快速查看某个查询的SQL和参数,直接用Laravel自带的dd()辅助函数就行,它会终止脚本并输出直观的详细信息:

App\User::where('id', 1)->dd();

输出内容会包含SQL语句、绑定的参数数组,不用自己手动处理占位符。

类似CodeIgniter last_query()的方式

如果想获取最近执行的查询,可以开启查询日志后获取:

// 开启查询日志
DB::enableQueryLog();

// 执行你的查询操作
App\User::find(1);

// 获取所有查询日志,取最后一条
$lastQuery = end(DB::getQueryLog());

// 处理成完整SQL
$fullSql = str_replace('?', '%s', $lastQuery['query']);
$fullSql = vsprintf($fullSql, $lastQuery['bindings']);
echo $fullSql;

注意:查询日志会消耗一定性能,生产环境建议关闭。

内容的提问来源于stack exchange,提问作者Arafat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:41:17