Laravel 5 Eloquent: How to get raw sql that is bei

2019-04-08 21:46发布

问题:

Im trying to figure out how to get the raw sql query being executed including the binded data in it. Here is what ive got:

\DB::connection()->enableQueryLog();
$query = \DB::getQueryLog();
$lastQuery = end($query);

And here is what the result looks like:

array(3) {
  ["query"]=>
  string(57) "select * from `table_1` where `field_1` = ? limit 1"
  ["bindings"]=>
  array(1) {
    [0]=>
    string(34) "xyz"
  }
}

So how do I get a dump of a full sql query like this (the good old fashioned way)?

select * from `table_1` where `field_1` = 'xyz' limit 1

Thanks

回答1:

You may want to check out the Laravel debugbar. I wouldn't develop a Laravel app without it. It will give you a breakdown of all queries (including repeated queries and ajax queries), with the speed they executed at and a note to the line in the controller/method that called them. (It provides TONS more info as well, such as views, gates, routes, etc.)

Also, Laravel has a toSql() method that you can use instead of your example. It will only show you the prepared statement as your example does, but it's at least a little cleaner. If you use toSql(), you have to apply it before you execute the query though.

$foo = Foo::where('bar', 'baz');
$foo_sql = $foo->toSql();
$foo->get();


回答2:

Add this in your routes Folder :

\Event::listen('Illuminate\Database\Events\QueryExecuted', function ($query) {
    Log::info( json_encode($query->sql) );
    Log::info( json_encode($query->bindings) );
    Log::info( json_encode($query->time)   );
});

Log::info() ==> will log the SQL query in your storage/logs/laravel.log file

var_dump() ==> will display in the API call output



回答3:

Try to add event listener for query :

Event::listen('illuminate.query', function($query)
{
    var_dump($query);
});

or

$results = User::where('id',$id)->toSql();
dd($results)


回答4:

Another option is to get the queries from Laravel Debugbar:

$queries = debugbar()->getCollector('queries');  
$statements = $queries->collect()['statements'];
dd($statements);