Laravel实时监听打印SQL

Laravel2019-11-19 12:17:50301条
Laravel5如何实现打印sql,Elequent ORM ->toSql() 可以输出sql语句,但如果带binding参数的,输出的语句会带?。可以通过事件监听器来记录sql语句到日志中。

Elequent ORM ->toSql()可以输出sql语句,但如果带binding参数的,输出的语句会带,类似下面这样:

select * from `rooms` where `rooms`.`project_id` = ?;

barryvdh/laravel-debugbar这个包需要添加代码注入配置,仅限浏览器输出,如果是postman工具调试,就无法查看输出的SQL了。 下面通过事件监听器将sql语句保存到Log日志中:

  1. 首先,创建监听器
php artisan make:listener QueryListener --event=Illuminate\\Database\\Events\\QueryExecuted
  1. 打开app/Providers/EventServiceProvider.php,在$listen中添加
protected $listen = [
    'Illuminate\Database\Events\QueryExecuted' => [
        'App\Listeners\QueryListener',
    ]
];
  1. 打开QueryListener文件
use \Log;
public function handle (QueryExecuted $event)
{
    if (env('APP_ENV', 'production') == 'local') {
        $sql = str_replace("?", "'%s'", $event->sql);
        $log = vsprintf($sql, $event->bindings);
        Log::info($log);
    }
}
评论啦~
共有1条评论
  1. 阳阳
    可以将sql写错,,也可以输出
    2020-01-20 02:49:10