Laravel 数据库:输出 SQL 语句 1 个改进

问题

如何让查询构造器将其原始 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.

  1. 添加以下宏方法到 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());
});
  1. 为 Eloquent Builder 添加别名. (Laravel 5.4+)
\Illuminate\Database\Eloquent\Builder::macro('toRawSql', function(){
    return ($this->getQuery()->toRawSql());
});
  1. 然后像往常一样调试. (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

你可以使用此包来获取加载页面时执行的所有查询:

https://github.com/barryvdh/laravel-debugb...

截屏:

输出 SQL 语句

参考:https://stackoverflow.com/questions/1823...

本文为 Wiki 文章,邀您参与纠错、纰漏和优化
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!