How to Get the Query Executed in Laravel 5? DB::getQueryLog() Returning Empty Array How to Get the Query Executed in Laravel 5? DB::getQueryLog() Returning Empty Array php php

How to Get the Query Executed in Laravel 5? DB::getQueryLog() Returning Empty Array


By default, the query log is disabled in Laravel 5:https://github.com/laravel/framework/commit/e0abfe5c49d225567cb4dfd56df9ef05cc297448

You will need to enable the query log by calling:

DB::enableQueryLog();// and then you can get query logdd(DB::getQueryLog());

or register an event listener:

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

Some Tips

1. Multiple DB connections

If you have more than one DB connection you must specify which connection to log

To enables query log for my_connection:

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

To get query log for my_connection:

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

2. Where to enable query log ?

For an HTTP request lifecycle, you can enable query log in the `handle` method of some `BeforeAnyDbQueryMiddleware` [middleware][1] and then retrieve the executed queries in the [`terminate`][2] method of the same middleware.
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()        );    }}

A middleware's chain will not run for artisan commands, so for CLI execution you can enable query log in the artisan.start event listener.

For example you can put it in the bootstrap/app.php file

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

3. Memory

Laravel keeps all queries in memory. So in some cases, such as when inserting a large number of rows, or having a long running job with a lot of queries, this can cause the application to use excess memory.

In most cases you will need the query log only for debugging, and if that is the case I would recommend you enable it only for development.

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

References


If all you really care about is the actual query (the last one run) for quick debugging purposes:

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

do a print_r() on $laQuery[0] to get the full query, including the bindings. (the $lcWhatYouWant variable above will have the variables replaced with ??)

If you're using something other than the main mysql connection, you'll need to use these instead:

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

(with your connection name where "mysql2" is)


You need to first enable query logging

DB::enableQueryLog();

Then you can get query logs by simply:

dd(DB::getQueryLog());

It would be better if you enable query logging before application starts, which you can do in a BeforeMiddleware and then retrieve the executed queries in AfterMiddleware.