188

How can I retrieve the raw executed SQL query in Laravel 3/4 using Laravel Query Builder or Eloquent ORM?

For example, something like this:

DB::table('users')->where_status(1)->get();

Or:

(posts (id, user_id, ...))

User::find(1)->posts->get();

Otherwise, at the very least how can I save all queries executed to laravel.log?

Xavier Priour
  • 2,121
  • 1
  • 12
  • 16
Patrick Maciel
  • 4,874
  • 8
  • 40
  • 80

21 Answers21

320

Laravel 4+

Note for Laravel 5 users: You'll need to call DB::enableQueryLog() before executing the query. Either just above the line that runs the query or inside a middleware.

In Laravel 4 and later, you have to call DB::getQueryLog() to get all ran queries.

$queries = DB::getQueryLog();
$last_query = end($queries);

Or you can download a profiler package. I'd recommend barryvdh/laravel-debugbar, which is pretty neat. You can read for instructions on how to install in their repository.


Laravel 3

In Laravel 3, you can get the last executed query from an Eloquent model calling the static method last_query on the DB class.

DB::last_query();

This, however, requires that you enable the profiler option in application/config/database.php. Alternatively you could, as @dualed mentioned, enable the profiler option, in application/config/application.php or call DB::profile() to get all queries ran in the current request and their execution time.

rmobis
  • 26,129
  • 8
  • 64
  • 65
31

You can enable the "Profiler" in Laravel 3 by setting

'profiler' => true,

In your application/config/application.php and application/config/database.php

This enables a bar at the bottom of each page. One of its features is listing the executed queries and how long each one took.

enter image description here

dualed
  • 10,262
  • 1
  • 26
  • 29
  • 14
    Note that in Laravel 4, the Profiler is not included, you have to install it by yourself (e.g. using composer). See [this SO question](http://stackoverflow.com/questions/14536165/get-the-query-executed-in-laravel-3-4). – duality_ Mar 05 '13 at 11:56
  • 1
    It's discussed in the [first answer there](http://stackoverflow.com/a/14536215/291557). – duality_ Feb 24 '14 at 06:44
26

For Eloquent you can just do:

$result->getQuery()->toSql();

But you need to remove the "->get()" part from your query.

JamesPlayer
  • 1,834
  • 2
  • 15
  • 21
19

I would recommend using the Chrome extension Clockwork with the Laravel package https://github.com/itsgoingd/clockwork. It's easy to install and use.

Clockwork is a Chrome extension for PHP development, extending Developer Tools with a new panel providing all kinds of information useful for debugging and profiling your PHP scripts, including information on request, headers, GET and POST data, cookies, session data, database queries, routes, visualisation of application runtime and more. Clockwork includes out of the box support for Laravel 4 and Slim 2 based applications, you can add support for any other or custom framework via an extensible API.

enter image description here

Markus Hedlund
  • 23,374
  • 22
  • 80
  • 109
16

Since the profiler is not yet out in Laravel 4, I've created this helper function to see the SQL being generated:


    public static function q($all = true) 
    {
        $queries = DB::getQueryLog();

        if($all == false) {
            $last_query = end($queries);
            return $last_query;
        }

        return $queries;
    }

NOTE: Set the $all flag to false if you only want the last SQL query.

I keep this sort of functions in a class called DBH.php (short for Database Helper) so I can call it from anywhere like this:

dd(DBH::q()); 

Here is the output I get: enter image description here

In case you are wondering, I use Kint for the dd() formatting. http://raveren.github.io/kint/

The Alpha
  • 143,660
  • 29
  • 287
  • 307
Ricardo Rossi
  • 524
  • 5
  • 13
14

For Laraver 4 it's

DB::getQueryLog()
misaizdaleka
  • 1,776
  • 3
  • 21
  • 32
14

Here is a quick Javascript snippet you can throw onto your master page template. As long as it's included, all queries will be output to your browser's Javascript Console. It prints them in an easily readable list, making it simple to browse around your site and see what queries are executing on each page.

When you're done debugging, just remove it from your template.

<script type="text/javascript">
    var queries = {{ json_encode(DB::getQueryLog()) }};
    console.log('/****************************** Database Queries ******************************/');
    console.log(' ');
    queries.forEach(function(query) {
        console.log('   ' + query.time + ' | ' + query.query + ' | ' + query.bindings[0]);
    });
    console.log(' ');
    console.log('/****************************** End Queries ***********************************/');
</script>
rmobis
  • 26,129
  • 8
  • 64
  • 65
Adam
  • 211
  • 3
  • 2
11

Laravel 5

Note that this is the procedural approach, which I use for quick debugging

    DB::enableQueryLog();

    // Run your queries
    // ...

    // Then to retrieve everything since you enabled the logging:
    $queries = DB::getQueryLog();
    foreach($queries as $i=>$query)
    {
        Log::debug("Query $i: " . json_encode($query));
    }

in your header, use:

     use DB;
     use Illuminate\Support\Facades\Log;

The output will look something like this (default log file is laravel.log):

[2015-09-25 12:33:29] testing.DEBUG: Query 0: {"query":"select * from 'users' where ('user_id' = ?)","bindings":["9"],"time":0.23}

***I know this question specified Laravel 3/4 but this page comes up when searching for a general answer. Newbies to Laravel may not know there is a difference between versions. Since I never see DD::enableQueryLog() mentioned in any of the answers I normally find, it may be specific to Laravel 5 - perhaps someone can comment on that.

Bryan
  • 2,191
  • 20
  • 28
7

You can also listen for query events using this:

DB::listen(function($sql, $bindings, $time)
{
    var_dump($sql);
});

See the information from the docs here under Listening For Query Events

SnapShot
  • 5,464
  • 5
  • 42
  • 40
6

Using the query log doesnt give you the actual RAW query being executed, especially if there are bound values. This is the best approach to get the raw sql:

DB::table('tablename')->toSql();

or more involved:

$query = Article::whereIn('author_id', [1,2,3])->orderBy('published', 'desc')->toSql();
dd($query);
omar j
  • 521
  • 6
  • 8
5

If you are using Laravel 5 you need to insert this before query or on middleware :

\DB::enableQueryLog();
Mandeep Gill
  • 4,577
  • 1
  • 28
  • 34
4

Or as alternative to laravel 3 profiler you can use:

https://github.com/paulboco/profiler or https://github.com/barryvdh/laravel-debugbar

karelv
  • 756
  • 9
  • 20
3

in Laravel 4 you can actually use an Event Listener for database queries.

Event::listen('illuminate.query', function($sql, $bindings)
{
    foreach ($bindings as $val) {
        $sql = preg_replace('/\?/', "'{$val}'", $sql, 1);
    }

    Log::info($sql);
});

Place this snippet anywhere, e.g. in start/global.php. It'll write the queries to the info log (storage/log/laravel.log).

aebersold
  • 11,286
  • 2
  • 20
  • 29
3
Event::listen('illuminate.query', function($sql, $param)
{
    \Log::info($sql . ", with[" . join(',', $param) ."]<br>\n");
});

put it in global.php it will log your sql query.

Christland
  • 31
  • 3
2

The Loic Sharma SQL profiler does support Laravel 4, I just installed it. The instructions are listed here. The steps are the following:

  1. Add "loic-sharma/profiler": "1.1.*" in the require section in composer.json
  2. Perform self-update => php composer.phar self-update in the console.
  3. Perform composer update => php composer.phar update loic-sharma/profiler in the console as well `
  4. Add 'Profiler\ProfilerServiceProvider', in the provider array in app.php
  5. Add 'Profiler' => 'Profiler\Facades\Profiler', in the aliasses array in app.php as well
  6. Run php artisan config:publish loic-sharma/profiler in the console
bicycle
  • 8,315
  • 9
  • 52
  • 72
2

Last query print

$queries = \DB::getQueryLog();
$last_query = end($queries);

// Add binding to query
foreach ($last_query['bindings'] as $val) {
        $last_query['query'] = preg_replace('/\?/', "'{$val}'", $last_query['query'], 1);
}
dd($last_query);
Dulitha K
  • 2,088
  • 1
  • 19
  • 18
1

L4 one-liner

(which write query):

$q=\DB::getQueryLog();dd(end($q));

Kamil Kiełczewski
  • 85,173
  • 29
  • 368
  • 345
0

Laravel 3

Another way to do this is:

#config/database.php

'profiler' => true

For all Queries result:

print_r(DB::profiler());

For last Result:

print_r(DB::last_query());
Community
  • 1
  • 1
Wallace Vizerra
  • 3,382
  • 2
  • 28
  • 29
0

To get the last executed query in laravel,We will use DB::getQueryLog() function of laravel it return all executed queries. To get last query we will use end() function which return last executed query.

$student = DB::table('student')->get();
$query = DB::getQueryLog();
$lastQuery = end($query);
print_r($lastQuery);

I have taken reference from http://www.tutsway.com/how-to-get-the-last-executed-query-in-laravel.php.

Deenadhayalan Manoharan
  • 5,436
  • 14
  • 30
  • 50
Manish
  • 328
  • 3
  • 9
  • Your answer does not seem to contribute any new knowledge to what the accepted answer by Raphael_ already covers. – Jaak Kütt May 18 '15 at 06:26
0

There is very easy way to do it, from your laravel query just rename any column name, it will show you an error with your query.. :)

Aamir
  • 2,173
  • 1
  • 29
  • 58
0

In Laravel 8.x you can listen to the event by registering your query listener in a service provider as documented in laravel.com website.

//header
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;

public function boot()
{
   
  DB::listen(function ($query) {            
   Log::debug("SQL : " . $query->sql);
  });

}

You can then see all the queries in the laravel.log file inside storage\logs\laravel.log

Nava Bogatee
  • 1,465
  • 13
  • 15