首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Laravel 5中执行查询?DB::getQueryLog()返回空数组

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

Stack Overflow用户
提问于 2015-01-03 18:30:06
回答 14查看 286.1K关注 0票数 193

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

代码语言:javascript
复制
$user = User::find(5);
print_r(DB::getQueryLog());

结果

代码语言:javascript
复制
Array
(
)

如何查看此查询的日志?

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2015-01-03 18:33:07

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

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

代码语言:javascript
复制
DB::enableQueryLog();

// and then you can get query log

dd(DB::getQueryLog());

或者注册一个事件监听器:

代码语言:javascript
复制
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.多个DB连接

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

my_connection启用查询日志

代码语言:javascript
复制
DB::connection('my_connection')->enableQueryLog();

获取my_connection的查询日志

代码语言:javascript
复制
print_r(
   DB::connection('my_connection')->getQueryLog()
);

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

对于HTTP请求生命周期,您可以在某些BeforeAnyDbQueryMiddleware中间件的handle方法中启用查询日志,然后在同一中间件的terminate方法中检索已执行的查询。

代码语言:javascript
复制
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文件中

代码语言:javascript
复制
$app['events']->listen('artisan.start', function(){
    \DB::enableQueryLog();
});

3.记忆

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

在大多数情况下,您只需要用于调试的查询日志,如果是这样的话,我建议您只在开发时启用它。

代码语言:javascript
复制
if (App::environment('local')) {
    // The environment is local
    DB::enableQueryLog();
}

参考

票数 284
EN

Stack Overflow用户

发布于 2016-06-13 20:38:40

如果您真正关心的是用于快速调试目的的实际查询(最后运行的查询):

代码语言:javascript
复制
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连接,则需要使用以下内容:

代码语言:javascript
复制
DB::connection("mysql2")->enableQueryLog();

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

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

票数 45
EN

Stack Overflow用户

发布于 2015-04-16 02:42:43

您需要首先启用查询日志记录

代码语言:javascript
复制
DB::enableQueryLog();

然后,您可以通过以下方式获取查询日志:

代码语言:javascript
复制
dd(DB::getQueryLog());

最好在应用程序启动之前启用查询日志记录,您可以在BeforeMiddleware中这样做,然后在AfterMiddleware中检索已执行的查询。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27753868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档