【问题标题】:Laravel 5 Eloquent: How to get raw sql that is being executed? (with binded data)Laravel 5 Eloquent:如何获取正在执行的原始 sql? (带有绑定数据)
【发布时间】: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

谢谢

【问题讨论】:

标签: php mysql laravel-5


【解决方案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 调用输出中

          【讨论】:

          • 太棒了。为我节省了一些宝贵的时间。
          猜你喜欢
          • 2015-07-13
          • 2014-05-11
          • 2013-07-14
          • 2019-04-27
          • 2015-09-08
          • 2014-06-06
          • 1970-01-01
          • 1970-01-01
          • 2018-11-15
          相关资源
          最近更新 更多