Laravel 5 Eloquent:如何获取正在执行的原始 sql? (带有绑定数据)
Posted
技术标签:
【中文标题】Laravel 5 Eloquent:如何获取正在执行的原始 sql? (带有绑定数据)【英文标题】:Laravel 5 Eloquent: How to get raw sql that is being executed? (with binded data) 【发布时间】:2017-01-09 06:11:10 【问题描述】:我试图弄清楚如何获取正在执行的原始 sql 查询,包括其中的绑定数据。这是我得到的:
\DB::connection()->enableQueryLog();
$query = \DB::getQueryLog();
$lastQuery = end($query);
结果如下:
array(3)
["query"]=>
string(57) "select * from `table_1` where `field_1` = ? limit 1"
["bindings"]=>
array(1)
[0]=>
string(34) "xyz"
那么我如何获得这样的完整 sql 查询的转储(老式的好方法)?
select * from `table_1` where `field_1` = 'xyz' limit 1
谢谢
【问题讨论】:
这很简单:***.com/questions/27753868/… 【参考方案1】:将此函数添加到您的应用程序并简单地调用。
function getQuery($sql)
$query = str_replace(array('?'), array('\'%s\''), $sql->toSql());
$query = vsprintf($query, $sql->getBindings());
return $query;
$foo = Foo::where('bar', 'baz');
print_r(getQuery($foo));
输出:select * from Foo
where bar
= 'baz'
【讨论】:
【参考方案2】:另一种选择是从 Laravel Debugbar 获取查询:
$queries = debugbar()->getCollector('queries');
$statements = $queries->collect()['statements'];
dd($statements);
【讨论】:
【参考方案3】:您可能想查看Laravel debugbar。没有它我不会开发 Laravel 应用程序。它将为您提供所有查询(包括重复查询和 ajax 查询)的细分,以及它们的执行速度以及调用它们的控制器/方法中的行的注释。 (它还提供了更多信息,例如视图、大门、路线等)
此外,Laravel 有一个 toSql()
方法,您可以使用它来代替您的示例。 它只会像您的示例一样向您显示准备好的语句,但它至少更简洁一些。如果您使用toSql()
,则必须在执行查询之前应用它。
$foo = Foo::where('bar', 'baz');
$foo_sql = $foo->toSql();
$foo->get();
【讨论】:
【参考方案4】:尝试添加事件监听器进行查询:
Event::listen('illuminate.query', function($query)
var_dump($query);
);
或
$results = User::where('id',$id)->toSql();
dd($results)
【讨论】:
【参考方案5】:将此添加到您的路线文件夹中:
\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() ==> 会将 SQL 查询记录在 storage/logs/laravel.log 文件中
var_dump() ==> 将显示在 API 调用输出中
【讨论】:
太棒了。为我节省了一些宝贵的时间。以上是关于Laravel 5 Eloquent:如何获取正在执行的原始 sql? (带有绑定数据)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 laravel 5 中使用 Eloquent 更新数据透视表
如何在 Eloquent ORM laravel 中获取最后一个插入 ID
Laravel 4.2 Eloquent 获取特定用户和特定角色
在 Laravel 5 Eloquent 中获取原始 SQL 查询的结果