Laravel 数据库:输出 SQL 语句
问题
如何让查询构造器将其原始 SQL 查询输出为字符串?
选项 1. getQueryLog
:
要使用,你需要手动开启:
DB::enableQueryLog();
要将 SQL 输出到屏幕,你可以使用:
dd(DB::getQueryLog());
最近的查询语句将位于数组的底部。
类似下面这样:
array:1 [
0 => array:3 [
"query" => "select * from `users` where `name` = ?"
"bindings" => array:1 [
0 => "myname"
]
"time" => 1.19
]
]
选项 2. getQueryLog
:
对于 laravel 5.5.X
如果你希望接收应用程序执行的每个 SQL 查询,可以使用 listen
方法。 此方法对于记录查询或调试很有用。 你可以在服务提供者中注册你的查询侦听器:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* 引导应用程序服务
*
* @return void
*/
public function boot()
{
DB::listen(function ($query) {
// $query->sql
// $query->bindings
// $query->time
});
}
/**
* 注册服务提供者
*
* @return void
*/
public function register()
{
//
}
}
选项 3. toSql
:
你可以使用 toSql()
方法做以下的事情,
$query = \DB::table('users')->where('name', 'myname');
echo $query->toSql();
Output:
select * from `users` where `name` = ?
想要绑定数据?使用以下方法:
$query = \DB::table('users')->where('name', 'myname');
$sql = str_replace_array('?', $query->getBindings(), $query->toSql());
echo $sql;
输出:
select * from `users` where `name` = myname
选项 4. 改进后的 toRawSql
(推荐):
我们来自定义一个 'macroable' 带有获取绑定数据的 SQL 查询替换 toSql
.
- 添加以下宏方法到
AppServiceProvider
boot()
.
\Illuminate\Database\Query\Builder::macro('toRawSql', function(){
return array_reduce($this->getBindings(), function($sql, $binding){
return preg_replace('/\?/', is_numeric($binding) ? $binding : "'".$binding."'" , $sql, 1);
}, $this->toSql());
});
- 为 Eloquent Builder 添加别名. (Laravel 5.4+)
\Illuminate\Database\Eloquent\Builder::macro('toRawSql', function(){
return ($this->getQuery()->toRawSql());
});
- 然后像往常一样调试. (Laravel 5.4+)
E.g. Query Builder
>>> echo \DB::table('users')->where('name', 'myname')->toRawSql();
select * from `users` where `name` = 'myname'
E.g. Eloquent Builder
>>> echo User::where('name', 'myname')->toRawSql();
select * from `users` where `name` = 'myname'
选项 5. laravel-debugbar
你可以使用此包来获取加载页面时执行的所有查询:
截屏: