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.
- 添加以下宏方法到 AppServiceProviderboot().
\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
你可以使用此包来获取加载页面时执行的所有查询:
截屏:

 
           Laravel 社区 Wiki
 Laravel 社区 Wiki
     
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             关于 LearnKu
                关于 LearnKu
               
                     
                     
                     粤公网安备 44030502004330号
 粤公网安备 44030502004330号 
 
推荐文章: