如何在Laravel 5中执行查询?DB::getQueryLog() 返回空数组

2022-08-30 06:24:53

我正在尝试查看查询的日志,但只是返回一个空数组:DB::getQueryLog()

$user = User::find(5);
print_r(DB::getQueryLog());

结果

Array
(
)

如何查看此查询的日志?


答案 1

默认情况下,查询日志在 Laravel 5 中处于禁用状态:https://github.com/laravel/framework/commit/e0abfe5c49d225567cb4dfd56df9ef05cc297448

您需要通过调用以下命令来启用查询日志:

DB::enableQueryLog();

// and then you can get query log

dd(DB::getQueryLog());

或注册事件侦听器:

DB::listen(
    function ($sql, $bindings, $time) {
        //  $sql - select * from `ncv_users` where `ncv_users`.`id` = ? limit 1
        //  $bindings - [5]
        //  $time(in milliseconds) - 0.38 
    }
);  

一些提示

1. 多个数据库连接

如果您有多个数据库连接,则必须指定要记录的连接

要启用 查询日志,请执行以下操作:my_connection

DB::connection('my_connection')->enableQueryLog();

要获取 查询日志,请执行以下操作:my_connection

print_r(
   DB::connection('my_connection')->getQueryLog()
);

2. 在哪里启用查询日志?

对于 HTTP 请求生命周期,您可以在某些 “BeforeAnyDbQueryMiddleware” [中间件][1] 的 “handle” 方法中启用查询日志,然后在同一中间件的 ['terminate'][2] 方法中检索已执行的查询。
class BeforeAnyDbQueryMiddleware
{
    public function handle($request, Closure $next)
    {
        DB::enableQueryLog();
        return $next($request);
    }

    public function terminate($request, $response)
    {
        // Store or dump the log data...
        dd(
            DB::getQueryLog()
        );
    }
}

中间件的链不会针对 artisan 命令运行,因此对于 CLI 执行,您可以在事件侦听器中启用查询日志。artisan.start

例如,您可以将其放在文件中bootstrap/app.php

$app['events']->listen('artisan.start', function(){
    \DB::enableQueryLog();
});

3. 内存

Laravel将所有查询保存在内存中。因此,在某些情况下,例如插入大量行时,或者具有具有大量查询的长时间运行的作业时,这可能会导致应用程序使用多余的内存。

在大多数情况下,您只需要查询日志进行调试,如果是这种情况,我建议您仅将其用于开发。

if (App::environment('local')) {
    // The environment is local
    DB::enableQueryLog();
}

引用


答案 2

如果您真正关心的只是实际的查询(最后一次运行),以便快速调试:

DB::enableQueryLog();

# your laravel query builder goes here

$laQuery = DB::getQueryLog();

$lcWhatYouWant = $laQuery[0]['query']; # <-------

# optionally disable the query log:
DB::disableQueryLog();

执行 on 以获取完整的查询,包括绑定。(上面的变量将变量替换为print_r()$laQuery[0]$lcWhatYouWant??)

如果您使用的是主 mysql 连接以外的其他连接,则需要改用以下命令:

DB::connection("mysql2")->enableQueryLog();

DB::connection("mysql2")->getQueryLog();

(使用您的连接名称,其中“mysql2”是)


推荐