Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel 4 - logging SQL queries

Tags:

php

laravel

There are already several questions in regards to logging the SQL query in Laravel 4. But I've tried almost all of them and it's still not working the way I want.

Here's my situation

  1. in my php view file, I make AJAX request to the server
  2. The AJAX request is received and runs a RAW parameterized Postgres SQL query (e.g.

    DB::select('select * from my_table where id=?', array(1))

If I use

Event::listen('illuminate.query', function($sql) {   Log::error($sql); }); 

I just get "select * from my_table where id=?" as the log message without the ID value actually populated.

If I use

$queries = DB::getQueryLog(); $last_query = end($queries); Log::error(print_r($last_query, true)); 

I still don't have the final SQL query with the ID populated.

Finally, if I use a logging tool like https://github.com/loic-sharma/profiler - it doesn't display anything since I'm making an AJAX request.

Have I exhausted my options? Is there still another better way?

like image 930
ericbae Avatar asked Oct 02 '13 07:10

ericbae


People also ask

How to log SQL queries in Laravel?

Log in the default log file “laravel. log” located at “storage/logs”. To log SQL queries, we have to add the following code snippet in the “AppServiceProvider. php” file in the “boot()” function, located at “app/Providers”.

What is query () in Laravel?

In Laravel the database query builder provides an easy interface to create and run database queries. It can be used to perform all the database operations in your application, from basic DB Connection, CRUD, Aggregates, etc. and it works on all supported database systems like a champ.

Does Laravel use SQL?

Currently Laravel supports four database systems: MySQL, Postgres, SQLite, and SQL Server.


1 Answers

Here is what I am currently using for logging of sql queries. You should be able to drop this into your main routes file then add 'log' => true into your database config.

if (Config::get('database.log', false)) {                Event::listen('illuminate.query', function($query, $bindings, $time, $name)     {         $data = compact('bindings', 'time', 'name');          // Format binding data for sql insertion         foreach ($bindings as $i => $binding)         {                if ($binding instanceof \DateTime)             {                    $bindings[$i] = $binding->format('\'Y-m-d H:i:s\'');             }             else if (is_string($binding))             {                    $bindings[$i] = "'$binding'";             }            }                 // Insert bindings into query         $query = str_replace(array('%', '?'), array('%%', '%s'), $query);         $query = vsprintf($query, $bindings);           Log::info($query, $data);     }); } 

Thanks to Jeemusu answer for the bit about inserting the bindings into the prepared statement.

like image 142
Collin James Avatar answered Sep 23 '22 20:09

Collin James