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 查询的结果

如何查询 Laravel Eloquent 的 belongsTo 关系?

Laravel 5.2 Eloquent ORM 从 3 个表中获取数据