65
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

julianstark999
  • 3,225
  • 1
  • 28
  • 38
Benjamin W
  • 2,338
  • 7
  • 22
  • 45
  • Possible duplicate of [How to get the query executed in Laravel 5 ? DB::getQueryLog returning empty array](http://stackoverflow.com/questions/27753868/how-to-get-the-query-executed-in-laravel-5-dbgetquerylog-returning-empty-arr) – Raunak Gupta Dec 14 '16 at 13:23

11 Answers11

146

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();
    return dd($queries);
}
julianstark999
  • 3,225
  • 1
  • 28
  • 38
kapilpatwa93
  • 3,583
  • 1
  • 12
  • 22
51

To see the query logs in laravel.log file you can do it as below.

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,
                $query->bindings,
                $query->time
            );
        });
    }

    // ...
}
Muhammad
  • 5,693
  • 4
  • 39
  • 54
22

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.

Alexey Mezenin
  • 148,626
  • 22
  • 267
  • 261
6

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
markdwhite
  • 2,269
  • 17
  • 22
3

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);
Juliano
  • 53
  • 8
3

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

DB::enableQueryLog();

$data = $order->all();

$query = DB::getQueryLog();

dd($query);
Code Lღver
  • 15,434
  • 16
  • 54
  • 74
Abid Shah
  • 245
  • 2
  • 3
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

Mohamed Raza
  • 719
  • 6
  • 18
2

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

Após instalar, abra o terminal e execute o comando:

php artisan laravel-query-monitor

All queries executed by Eloquent will be displayed in real time

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();
Elisha Senoo
  • 3,321
  • 2
  • 23
  • 29
1

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

dipenparmar12
  • 2,318
  • 1
  • 25
  • 34
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

Bissel
  • 1
  • 1