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

12 浏览
0 Comments

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

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

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

结果

Array
(
)

如何查看这个查询的日志?

admin 更改状态以发布 2023年5月21日
0
0 Comments

如果你只关心用于快速调试的实际查询 (最后一次运行的查询):

DB::enableQueryLog();
# your laravel query builder goes here
$laQuery = DB::getQueryLog();
$lcWhatYouWant = $laQuery[0]['query']; # <-------
# optionally disable the query log:
DB::disableQueryLog();

$laQuery[0]上进行print_r(),以获得完整的查询,包括绑定。(上面的$lcWhatYouWant变量将被替换成??

如果你使用的不是主 mysql 连接,你需要使用这些:

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

(使用你的连接名称代替 "mysql2")

0
0 Comments

默认情况下,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` [middleware][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()
        );
    }
}


中间件链不会对工匠命令运行,因此对于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();
}


参考资料

0