简单实现Laravel获取当前执行的SQL

其实在执行代码的同时看一看当前的SQL是一个好习惯,一方面可以检查一下代码的错误,另一方面可以检查一下模型关联是否因为没有使用 with而导致多次查询。

新建一个文件 app\Listeners\QueryListener.php

<?php 

namespace App\Listeners;

use Illuminate\Database\Events\QueryExecuted;

class QueryListener  
{
    public function handle(QueryExecuted $event)  
    {
        $sql = str_replace("?", "'%s'", $event->sql);

        try {
            $log = vsprintf($sql, $event->bindings);
        } catch (\Exception $e) {
            $log = $sql;
        }

        $file = storage_path('logs/'.date('Ymd').'_sql.txt');
        file_put_contents($file, $log.PHP_EOL, FILE_APPEND);
    }
}

修改 app/Providers/EventServiceProvider.php

protected $listen = [
        'Illuminate\Database\Events\QueryExecuted' => [ 
            'App\Listeners\QueryListener'
        ]
    ];
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 8

$sql = str_replace(“?”, “‘%s’”, $event->sql);

  1. 这行代码没有考虑全面,如果 sql 里面其他地方(非PDO绑定)也有 ? 号,就会产生问题
3年前 评论
Adachi (楼主) 3年前
JerryBool (作者) 3年前

还是习惯用

DB::enableQueryLog();
dd(DB::getQueryLog());
3年前 评论
Adachi (楼主) 3年前
小猪蹄子 (作者) 3年前

确实有一些SQL处理之后会出现一些问题,99%以上的SQL是正常的吧,只是方便开发的时候查看是否会出现循环查询,或者查询出错了看一下where条件是否正确,或者其他一些方面的时候比较方便。

3年前 评论
playmaker

clockwork 不香嘛?

3年前 评论

overtrue/laravel-query-logger

3年前 评论
composer require overtrue/laravel-query-logger --dev

才是最简单的 👍

3年前 评论

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