【问题标题】:Get the Query Executed in Laravel 3/4获取在 Laravel 3/4 中执行的查询
【发布时间】:2013-01-10 06:20:49
【问题描述】:

如何使用 Laravel Query Builder 或 Eloquent ORM 在 Laravel 3/4 中检索原始执行的 SQL 查询?

例如,像这样的:

DB::table('users')->where_status(1)->get();

或者:

(posts (id, user_id, ...))

User::find(1)->posts->get();

否则,至少如何将所有执行的查询保存到 laravel.log?

【问题讨论】:

标签: php laravel orm eloquent laravel-query-builder


【解决方案1】:

您可以通过设置在 Laravel 3 中启用“Profiler

'profiler' => true,

在您的application/config/application.phpapplication/config/database.php

这会在每个页面的底部启用一个栏。它的功能之一是列出执行的查询以及每个查询所用的时间。

【讨论】:

  • 请注意,在 Laravel 4 中,Profiler 不包括在内,您必须自己安装它(例如使用 composer)。见this SO question
  • first answer there讨论过。
【解决方案2】:

Laravel 4+

Laravel 5 用户注意事项:您需要在执行查询之前调用 DB::enableQueryLog()。在运行查询的行上方或中间件内部。

在 Laravel 4 及更高版本中,您必须调用 DB::getQueryLog() 来获取所有运行的查询。

$queries = DB::getQueryLog();
$last_query = end($queries);

或者您可以下载分析器包。我推荐barryvdh/laravel-debugbar,它非常简洁。您可以在他们的repository 中阅读有关如何安装的说明。


Laravel 3

在 Laravel 3 中,您可以从 Eloquent 模型调用 DB 类上的静态方法 last_query 获取最后执行的查询。

DB::last_query();

但是,这需要您在application/config/database.php 中启用profiler 选项。或者,正如@dualed 所述,您可以在application/config/application.php 中启用profiler 选项或调用DB::profile() 以获取在当前请求中运行的所有查询及其执行时间。

【讨论】:

  • 您的 Laravel 4 代码不起作用。我得到这个ErrorException:警告:call_user_func_array() 期望参数 1 是一个有效的回调,类 Illuminate\Database\MySqlConnection 没有方法 getQueryList
  • 对于 Laravel 3 它实际上是 DB::last_query();您还需要在 application/config/database.php 中将 'profile' 设置为 true
  • 这似乎不适用于 L4 上的 Eloquent 模型。当我执行 Model::find($id) 并执行 DB::getQueryLog() 时返回空白数组 ()。知道如何获取 Eloquent 模型的查询吗?
  • L4 oneliner:$q=\DB::getQueryLog();dd(end($q));
  • 我要成为这个页面的常客了。
【解决方案3】:

对于 Laraver 4 是

DB::getQueryLog()

【讨论】:

    【解决方案4】:

    由于 Laravel 4 中还没有分析器,我创建了这个帮助函数来查看正在生成的 SQL:

    公共静态函数 q($all = true) { $查询 = DB::getQueryLog(); 如果($all == 假){ $last_query = end($queries); 返回 $last_query; } 返回$查询; }

    注意:如果您只想要最后一个 SQL 查询,请将 $all 标志设置为 false

    我将这类函数保存在一个名为 DBH.php(Database Helper 的缩写)的类中,这样我就可以像这样从任何地方调用它:

    dd(DBH::q()); 
    

    这是我得到的输出:

    如果您想知道,我使用 Kint 进行 dd() 格式化。 http://raveren.github.io/kint/

    【讨论】:

    • if($all == false)?为什么不简单地if(!$all)
    【解决方案5】:

    这是一个快速的 Javascript sn-p,您可以将其添加到您的母版页模板中。 只要包含它,所有查询都将输出到浏览器的 Javascript 控制台。 它将它们打印在一个易于阅读的列表中,便于浏览您的网站并查看每个页面上正在执行的查询。

    完成调试后,只需将其从模板中删除即可。

    <script type="text/javascript">
        var queries = {{ json_encode(DB::getQueryLog()) }};
        console.log('/****************************** Database Queries ******************************/');
        console.log(' ');
        queries.forEach(function(query) {
            console.log('   ' + query.time + ' | ' + query.query + ' | ' + query.bindings[0]);
        });
        console.log(' ');
        console.log('/****************************** End Queries ***********************************/');
    </script>
    

    【讨论】:

    • 我认为你需要 "" 在 {{ json_encode... }} 部分周围
    • @mydoglixu 因为DB::getQueryLog() 返回一个数组,所以不需要用“”括起来。 json_encode 会进行相应的翻译。
    • @mobis - 我的意思是你需要 {{ ... }} 之外的 "" 以便 javascript 不会引发错误。像这样: var queries = "json output";
    • @mydoglixu 你不需要,因为 JSON 数组(或对象)是有效的 JavaScript。如果你这样做,它会坏掉。
    • @mobis - 哦,是的,呵呵
    【解决方案6】:

    或者作为 laravel 3 profiler 的替代品,您可以使用:

    https://github.com/paulboco/profiler 要么 https://github.com/barryvdh/laravel-debugbar

    【讨论】:

      【解决方案7】:

      Loic Sharma SQL 分析器确实支持 Laravel 4,我刚刚安装了它。指令are listed here。步骤如下:

      1. 在要求部分添加"loic-sharma/profiler": "1.1.*" 在 composer.json 中
      2. 在控制台中执行自我更新 => php composer.phar self-update
      3. 在控制台中执行 composer update => php composer.phar update loic-sharma/profiler `
      4. 在提供者数组中添加'Profiler\ProfilerServiceProvider', app.php
      5. 添加'Profiler' =&gt; 'Profiler\Facades\Profiler', app.php 中的别名数组也是如此
      6. 在控制台中运行php artisan config:publish loic-sharma/profiler

      【讨论】:

        【解决方案8】:

        你也可以使用这个来监听查询事件:

        DB::listen(function($sql, $bindings, $time)
        {
            var_dump($sql);
        });
        

        查看文档here 中的信息,Listening For Query Events

        【讨论】:

          【解决方案9】:

          对于 Eloquent,您可以这样做:

          $result->getQuery()->toSql();
          

          但您需要从查询中删除“->get()”部分。

          【讨论】:

            【解决方案10】:

            我建议将 Chrome 扩展程序 Clockwork 与 Laravel 包 https://github.com/itsgoingd/clockwork 一起使用。它易于安装和使用。

            Clockwork 是一个用于 PHP 开发的 Chrome 扩展,扩展 带有提供各种信息的新面板的开发人员工具 可用于调试和分析您的 PHP 脚本,包括 有关请求、标头、GET 和 POST 数据、cookie、会话的信息 数据、数据库查询、路由、应用程序运行时的可视化 和更多。 Clockwork 包括对 Laravel 4 的开箱即用支持和 基于 Slim 2 的应用程序,您可以添加对任何其他或自定义的支持 框架通过可扩展的 API。

            【讨论】:

              【解决方案11】:

              在 Laravel 4 中,您实际上可以使用事件侦听器进行数据库查询。

              Event::listen('illuminate.query', function($sql, $bindings)
              {
                  foreach ($bindings as $val) {
                      $sql = preg_replace('/\?/', "'{$val}'", $sql, 1);
                  }
              
                  Log::info($sql);
              });
              

              把这个 sn-p 放在任何地方,例如在start/global.php。它将查询写入信息日志 (storage/log/laravel.log)。

              【讨论】:

                【解决方案12】:

                使用查询日志不会为您提供正在执行的实际 RAW 查询,尤其是在存在绑定值的情况下。 这是获取原始 sql 的最佳方法:

                DB::table('tablename')->toSql();
                

                或更多参与:

                $query = Article::whereIn('author_id', [1,2,3])->orderBy('published', 'desc')->toSql();
                dd($query);
                

                【讨论】:

                  【解决方案13】:
                  Event::listen('illuminate.query', function($sql, $param)
                  {
                      \Log::info($sql . ", with[" . join(',', $param) ."]<br>\n");
                  });
                  

                  把它放在 global.php 中它会记录你的 sql 查询。

                  【讨论】:

                    【解决方案14】:

                    上次查询打印

                    $queries = \DB::getQueryLog();
                    $last_query = end($queries);
                    
                    // Add binding to query
                    foreach ($last_query['bindings'] as $val) {
                            $last_query['query'] = preg_replace('/\?/', "'{$val}'", $last_query['query'], 1);
                    }
                    dd($last_query);
                    

                    【讨论】:

                      【解决方案15】:

                      Laravel 3

                      另一种方法是:

                      #config/database.php
                      
                      'profiler' => true
                      

                      对于所有查询结果:

                      print_r(DB::profiler());
                      

                      最后的结果:

                      print_r(DB::last_query());
                      

                      【讨论】:

                        【解决方案16】:

                        要获取 laravel 中最后执行的查询,我们将使用 laravel 的 DB::getQueryLog() 函数返回所有执行的查询。要获取最后一个查询,我们将使用 end() 函数返回最后执行的查询。

                        $student = DB::table('student')->get();
                        $query = DB::getQueryLog();
                        $lastQuery = end($query);
                        print_r($lastQuery);
                        

                        我参考了http://www.tutsway.com/how-to-get-the-last-executed-query-in-laravel.php

                        【讨论】:

                        • 您的回答似乎没有为 Raphael_ 已接受的回答所涵盖的内容提供任何新知识。
                        【解决方案17】:

                        Laravel 5

                        请注意,这是过程方法,我用于快速调试

                            DB::enableQueryLog();
                        
                            // Run your queries
                            // ...
                        
                            // Then to retrieve everything since you enabled the logging:
                            $queries = DB::getQueryLog();
                            foreach($queries as $i=>$query)
                            {
                                Log::debug("Query $i: " . json_encode($query));
                            }
                        

                        在您的标题中,使用:

                             use DB;
                             use Illuminate\Support\Facades\Log;
                        

                        输出将如下所示(默认日志文件为 laravel.log):

                        [2015-09-25 12:33:29] testing.DEBUG: 查询 0: {"query":"select * from 'users' where ('user_id' = ?)","bindings":["9"],"time":0.23}

                        ***我知道这个问题指定了 Laravel 3/4,但是在搜索一般答案时会出现此页面。 Laravel 的新手可能不知道版本之间存在差异。由于我从未在我通常找到的任何答案中看到DD::enableQueryLog(),它可能特定于 Laravel 5 - 也许有人可以对此发表评论。

                        【讨论】:

                          【解决方案18】:

                          如果您使用的是 Laravel 5,则需要在查询之前或中间件上插入:

                          \DB::enableQueryLog();
                          

                          【讨论】:

                            【解决方案19】:

                            有一种非常简单的方法可以做到这一点,从您的 laravel 查询中重命名任何列名,它会显示您的查询错误.. :)

                            【讨论】:

                            • 快速破解方法。在生产中没用,但在开发模式下,在某些情况下没问题。
                            【解决方案20】:

                            L4 单线

                            (哪个写查询):

                            $q=\DB::getQueryLog();dd(end($q));

                            【讨论】:

                              【解决方案21】:

                              在 Laravel 8.x 中,您可以通过在 服务提供者 中注册查询侦听器来侦听事件,如 laravel.com 网站中所述。

                              //header
                              use Illuminate\Support\Facades\DB;
                              use Illuminate\Support\Facades\Log;
                              
                              public function boot()
                              {
                                 
                                DB::listen(function ($query) {            
                                 Log::debug("SQL : " . $query->sql);
                                });
                              
                              }
                              
                              

                              然后您可以在storage\logs\laravel.log 内的laravel.log 文件中查看所有查询

                              【讨论】:

                                猜你喜欢
                                • 1970-01-01
                                • 2015-12-01
                                • 1970-01-01
                                • 1970-01-01
                                • 2013-07-14
                                • 1970-01-01
                                • 1970-01-01
                                • 2020-11-11
                                • 2013-12-01
                                相关资源
                                最近更新 更多