laravel 框架打印完整sql语句

laravel 框架打印完整sql语句

选项 1. getQueryLog:

要使用,你需要手动开启:

1
DB::enableQueryLog();

要将 SQL 输出到屏幕,你可以使用:

1
dd(DB::getQueryLog());

最近的查询语句将位于数组的底部。

类似下面这样:

1
2
3
4
5
6
7
8
9
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 方法。 此方法对于记录查询或调试很有用。 你可以在服务提供者中注册你的查询侦听器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?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() 方法做以下的事情,

1
2
3
$query = \DB::table('users')->where('name', 'myname');

echo $query->toSql();

Output:

1
select * from `users` where `name` = ?

想要绑定数据?使用以下方法:

1
2
3
4
$query = \DB::table('users')->where('name', 'myname'); 
$sql = str_replace_array('?', $query->getBindings(), $query->toSql());

echo $sql;

输出:

1
select * from `users` where `name` = myname

选项 4. 改进后的 toRawSql (推荐):

我们来自定义一个 ‘macroable’ 带有获取绑定数据的 SQL 查询替换 toSql.

添加以下宏方法到 AppServiceProvider boot().

1
2
3
4
5
\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+)

1
2
3
\Illuminate\Database\Eloquent\Builder::macro('toRawSql', function(){
return ($this->getQuery()->toRawSql());
});

然后像往常一样调试. (Laravel 5.4+)

E.g. Query Builder

1
2
>>> echo \DB::table('users')->where('name', 'myname')->toRawSql();
select * from `users` where `name` = 'myname'

E.g. Eloquent Builder

1
2
>>> echo User::where('name', 'myname')->toRawSql();
select * from `users` where `name` = 'myname'