98
use App\Order;
 
public function show(Order $order) {
    $data = $order->all();
    return dd($order->getQueryLog());

Is there any way to display the query built by Eloquent in Laravel?

I tried getQueryLog(); but its not working

1

12 Answers 12

204

First you have to enable query log it can be done using

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

then you can use below code to see the query log

$queries = DB::getQueryLog();

if you want to see the last executed query

$last_query = end($queries);

to know more about logging see this https://laravel.com/docs/5.0/database#query-logging

Example

public function show(Order $order){
    \DB::connection()->enableQueryLog();
    $data = $order->all();
    $queries = \DB::getQueryLog();

    dd($queries);
}
Sign up to request clarification or add additional context in comments.

3 Comments

is this only for DB query? I'm using eloquent, and I want to see laravel's query
it will work for eloquent as well, check the updated answer I have shown in the example
oh i didnt know I need to put enableQueryLog(); before my query, i put it behind lol, thx a lot!
91

To see the query logs in laravel.log file, update app/Providers/AppServiceProvider.php

namespace App\Providers;

use DB;
use Log;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        DB::listen(function($query) {
            Log::info(
                $query->sql,
                [
                    'bindings' => $query->bindings,
                    'time' => $query->time
                ]
            );
        });
    }

    // ...
}

2 Comments

Wow, I wish I knew about this years ago. So helpful! Thanks.
With this in place, there is no need to call DB::enableQueryLog()
35

To use getQueryLog() you need to enable it first:

DB::enableQueryLog();
DB::getQueryLog();

If you want to see real queries, you can use Laravel Debugbar, it will show all real queries Laravel created during current request.

Sometimes ->toSql() is also useful.

2 Comments

Much more succinct.
Wheere does this go?
9

Working on 5.6, something like this in AppServiceProvider::boot()

    // Log all DB SELECT statements
    // @codeCoverageIgnoreStart
    if (!app()->environment('testing') && config('app.log_sql')) {
        DB::listen(function ($query) {
            if (preg_match('/^select/', $query->sql)) {
                Log::info('sql: ' .  $query->sql);
                // Also available are $query->bindings and $query->time.
            }
        });
    }

Then in config/app.php, just so it's easy to enable/disable from amending the .env

    'log_sql' => env('LOG_SQL'),

All credit to: https://arjunphp.com/laravel-5-5-log-eloquent-queries/

And this can be parsed for unique queries with:

    grep ") sql:" laravel.log | sed -e "s#.*select\(.*\)\[\]#select\1#" | sort -u

Comments

6

write this before the query DB::enableQueryLog();

DB::enableQueryLog();

$data = $order->all();

$query = DB::getQueryLog();

dd($query);

Comments

4

I know it's an old question, but it might help others that had the same issue I had.

If you use other connection than the default one, you should specify it to get the query log properly.

\DB::connection('YourConnection')->enableQueryLog();
$test = MyModel::all();
$queries = \DB::connection('YourConnection')->getQueryLog();
dd($queries);

Comments

3

Query Execution

\Event::listen('Illuminate\Database\Events\QueryExecuted', function ($query) {          
            $sql = $query->sql; 
            $time = $query->time;
            $connection = $query->connection->getName();
 
            Log::debug('query : '.$sql);
            Log::debug('time '.$time);
            Log::debug('connection '.$connection);
        });

Query

StaffRegister::all();

Output

[2021-03-14 08:00:57] local.DEBUG: query : select * from `staff_registers`  
[2021-03-14 08:00:57] local.DEBUG: time 0.93  
[2021-03-14 08:00:57] local.DEBUG: connection mysql  

complete structure

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Log;
use App\Models\StaffRegister;

class AuthController extends Controller
{
   public function index(){
   
       \Event::listen('Illuminate\Database\Events\QueryExecuted', function ($query) {
      
           $sql = $query->sql; 
           $time = $query->time;
           $connection = $query->connection->getName();

           Log::debug('query : '.$sql);
           Log::debug('time '.$time);
           Log::debug('connection '.$connection);
       });

       $obj = StaffRegister::all(); 
    
       return $obj;
   }
}

Accurate Method

Comments

3

You can use this package https://github.com/supliu/laravel-query-monitor

After installing, open the terminal and run the command:

php artisan laravel-query-monitor

All queries executed by Eloquent will be displayed in real time

1 Comment

not sure why.. but seems not working
2

You can use my Laravel package which is work perfectly in Larave 6 and 7. (Not sure about laravel 5 or less.)

For use Install the package via composer: by following command

composer require dipenparmar12/laravel-query-log

restart server. after this you will see

storage/logs/db-query.log file containing your query logs.

For more details visit Laravel-query-log

Thanks

Comments

1

You can use ::toSql() or ->toSql() as demonstrated below:

use App\Order;

public function show(Order $order){

    return $order::toSql();

Or

use App\Order;

public function show(Order $order){

    return $order::where("id", "<>", 0)->toSql();

You might have to enable query log:

DB::enableQueryLog();

Comments

0

If you are using Laravel 6+ (i have not checked below 6), you can use

// show sql and bindings  +  stop execution
DB::table('your_table')->dd();   

// show sql and bindings
DB::table('your_table')->dump(); 

https://laravel.com/docs/7.x/queries#debugging

Comments

0

An easy and quick way I use for check queries during development is to make a voluntary mistake in one of the name of the columns of group or order sentences and then the sql query will be shown on the upper left frame of the debugger window.

It is not perfect because the datetimes are not shown with the "'", but it is easy, fast and doesn't require to add or enable anything additional.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.