48
votes
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

10

10 Answers

103
votes

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);
}
27
votes

To see the query logs in laravel.log file use the following way.

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
            );
        });
    }

    // ...
}
17
votes

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.

6
votes

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
2
votes

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);
2
votes

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

DB::enableQueryLog();

$data = $order->all();

$query = DB::getQueryLog();

dd($query);
1
votes

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();
1
votes

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

1
votes

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
votes

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