
Bug编译狮
要查看 Laravel 查询构建器生成的原始 SQL 查询,可以使用 toSql 方法。这个方法会返回查询语句字符串,但不会执行任何数据库操作。
以下是一个示例:
use AppModelsUser;
// 创建一个查询构建器实例
$query = User::query();
// 添加一些条件
$query->where('age', '>', 18);
// 打印原始 SQL 查询
echo $query->toSql();
输出将会是类似这样的 SQL 语句:
SELECT * FROM users WHERE age > ?
在这个例子中,? 是占位符,表示需要提供实际的值来填充它。
如果你想要在控制器或其他地方打印出完整的 SQL 查询,并且希望在调试过程中看到每个查询的详细信息,可以使用 DB::enableQueryLog() 和 DB::getQueryLog() 方法。
use IlluminateSupportFacadesDB;
// 启用查询日志
DB::enableQueryLog();
// 创建一个查询构建器实例
$query = User::query();
// 添加一些条件
$query->where('age', '>', 18);
// 执行查询
$result = $query->get();
// 获取查询日志
$logs = DB::getQueryLog();
// 输出查询日志
foreach ($logs as $log) {
echo $log['query'] . "n";
}
这样,你就可以看到整个查询的执行过程和生成的 SQL 语句了。

黑板Bug讲师
介绍
Laravel的查询构建器为开发人员提供了一种使用面向对象的PHP方法来创建数据库查询的方式。虽然这个工具使编写数据库查询变得更容易,但有时您可能需要检查Laravel生成的原始SQL查询以进行调试或优化数据库交互。
本教程将指导您通过查看使用Laravel的查询构建器生成的原始SQL查询,包括您可以使用的多种方法来获取不同类型查询的底层SQL语句。
启用查询日志
第一步调试查询时,启用查询日志是关键。Laravel 提供了一个方法叫做enableQueryLog那你可以用在上面的。DB装饰器。此方法会启用应用程序执行的所有查询的日志记录。要查看日志,您需要使用它。getQueryLog方法。
// Enable query log
DB::enableQueryLog();
// Execute some queries
User::where('votes', '>', 100)->get();
// Get the query log
$queries = DB::getQueryLog();
print_r($queries);
执行了您感兴趣的查询后,调用相应的函数即可。getQueryLog,Laravel 会以数组的形式输出已运行的查询。请注意,在生产环境中,查询日志可能会迅速增长并消耗大量内存。因此,建议不要经常保留它。
使用 toSql 方法
Laravel的查询构建器提供了一个toSql()可以附加到查询中的方法,用于生成SQL语句,但不包括参数绑定。这在开发或调试时特别有用。
$sql = User::where('votes', '>', 100)->toSql();
// Output the SQL statement
echo $sql;
// The output will be something like:
// select * from `users` where `votes` > ?
在运行查询时,显示的占位符表示绑定的位置。
添加绑定到输出
在…toSql()不包括您查询中绑定的实际值,您可以单独获取这些绑定并将它们与SQL结合使用以查看完整的查询。
$query = User::where('votes', '>', 100);
$sql = $query->toSql();
$bindings = $query->getBindings();
// Combine SQL and bindings
foreach ($bindings as $binding) {
$value = is_numeric($binding) ? $binding : "'". $binding . "'";
$sql = preg_replace("/?/", $value, $sql, 1);
}
// Output the complete SQL statement
echo $sql;
记得在处理值时要正确进行转义,以避免在结合SQL查询时出现问题。Laravel的Query Builder在实际执行查询时会自动处理这个问题,但在手动组合用于查看时,谨慎行事是有必要的。
使用Laravel Telescope
Laravel Telescope 是一个优雅的调试助手,适用于 Laravel,它提供了关于查询、请求、异常以及其他很多方面的洞察力。在安装了 Telescope 后,每执行一次 Laravel 的查询都会被记录下来,并且你可以查看详细的信息,包括原始 SQL 语句、执行时间以及结果。
composer require laravel/telescope
php artisan telescope:install
php artisan migrate
安装完成后,您可以访问。/telescope在您的申请中,请查看应用查询的详细日志。在“查询”部分,有一个功能可以查看查询的原始SQL语句。
数据库事件
Laravel 为每条执行的数据库查询都触发事件。你可以监听这些事件并在那里输出SQL语句。如果你希望在特定情况下仅记录某些查询,这种方法可能是合适的。
DB::listen(function ($query) {
Log::info("Query: {$query->sql} with ". implode(', ', $query->bindings));
});
请将听众放在任何服务提供商的任何地方。boot方法。
第三方包
由Laravel社区开发的包使得查看数据库查询变得容易,例如Debugbar。
composer require barryvdh/laravel-debugbar
安装并启用Debugbar后,它会在您的应用底部显示一个调试面板,您可以在其中查看执行的查询以及其他许多信息。
最后的发言
有了这些工具,使用Laravel的查询构建器生成的原始SQL查询浏览起来非常轻松,这为优化应用程序与数据库的交互提供了更深入的洞察力。
总结来说,使用DB::enableQueryLog()进行快速检查,toSql()在开发期间快速查看查询模板的绑定,可以使用Telescope或Debugbar来获得更全面的调试体验,而使用数据库事件则可用于条件化或更加粒度化的记录应用程序中的查询。

长工码奴1523
Laravel 的 Query Builder 是一个非常强大的功能,它允许您创建复杂的查询,并使用 SQL 语句来执行这些查询。然而,如果您需要查看 Laravel 生成的原始 SQL 查询,您可以使用以下方法:
-
使用 Laravel 的
view()方法:IlluminateDatabaseEloquentBuilder::view()示例:
$query = $model->get()->where('id', '>', 0); $sql = $query->view(); echo $sql; -
使用 Laravel 的
select()方法:IlluminateDatabaseEloquentBuilder::select()示例:
$query = $model->get()->where('id', '>', 0); $sql = $query->select('*'); echo $sql; -
使用 Laravel 的
orderBy()方法:IlluminateDatabaseEloquentBuilder::orderBy()示例:
$query = $model->get()->where('id', '>', 0); $sql = $query->orderBy('name')->select('*'); echo $sql; -
使用 Laravel 的
groupBy()方法:IlluminateDatabaseEloquentBuilder::groupBy()示例:
$query = $model->get()->where('id', '>', 0); $sql = $query->groupBy('status'); echo $sql; -
如果您的查询返回了多行数据,可以将它们合并为一个字符串:
$query = $model->get()->where('id', '>', 0)->get(); $rows = []; foreach ($query as $row) { $rows[] = $row; } $sql = implode(";n", $rows); echo $sql;
以上就是在 Laravel 中查看和解析生成的原始 SQL 查询的方法。希望这能帮助到您!

