
在不依赖 Laravel 框架的情况下单独使用 Eloquent ORM 时,可通过启用查询日志(Query Log)捕获 get() 等方法最终生成并执行的原始 SQL,便于调试与性能分析。
在不依赖 laravel 框架的情况下单独使用 eloquent orm 时,可通过启用查询日志(query log)捕获 `get()` 等方法最终生成并执行的原始 sql,便于调试与性能分析。
Eloquent 在脱离 Laravel 运行时仍保留完整的数据库连接与查询构建能力,但默认关闭查询日志以提升性能。要获取真实执行的 SQL,关键在于手动启用底层连接的查询日志功能,而非尝试调用不存在的 toSql()(该方法仅适用于查询构建器实例,如 Model::query()->where(...) 的中间状态,不适用于已执行的 get() 结果)。
正确做法如下:
$hmisModel = $this->hmisUsers;
// ✅ 启用查询日志(必须在执行前调用)
$hmisModel->getConnection()->enableQueryLog();
// 执行查询(此时 SQL 将被记录)
$hmisUsers = $hmisModel->orderBy('UserName')->get();
// ✅ 获取完整查询日志(返回数组,每个元素为 ['query' => '...', 'bindings' => [...], 'time' => ...])
$queries = $hmisModel->getConnection()->getQueryLog();
// 输出最新一条查询(通常即本次 get() 所用 SQL)
if (!empty($queries)) {
$lastQuery = end($queries);
echo "SQL: " . $lastQuery['query'] . "\n";
echo "Bindings: " . json_encode($lastQuery['bindings']) . "\n";
}
⚠️ 注意事项:
-
enableQueryLog()必须在查询执行之前调用,否则日志为空; -
getQueryLog()返回的是包含query、bindings和time的关联数组,query中的?占位符需结合bindings手动替换(生产环境调试建议使用DB::listen()或日志中间件,但独立 Eloquent 中暂无内置监听器); - 查询日志会占用内存,仅用于开发/诊断阶段,上线前务必禁用(可调用
disableQueryLog()); - 若模型使用了软删除(
SoftDeletes),生成的 SQL 会自动包含deleted_at IS NULL条件(除非显式调用withTrashed())。
通过该方式,你可在 Slim、Lumen 或纯 PHP 项目中精准掌握 Eloquent 底层发出的 SQL,大幅提升数据层问题排查效率。










