简单实现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 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 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年前 评论

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