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
相关产品推荐
相关产品推荐

