获取在Laravel 3/4中执行的查询

Pat*_*iel 178 php orm laravel eloquent laravel-query-builder

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

例如,像这样:

DB::table('users')->where_status(1)->get();
Run Code Online (Sandbox Code Playgroud)

要么:

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

User::find(1)->posts->get();
Run Code Online (Sandbox Code Playgroud)

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

rmo*_*bis 318

Laravel 4+

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

$queries = DB::getQueryLog();
$last_query = end($queries);
Run Code Online (Sandbox Code Playgroud)

或者您可以下载分析器包.我推荐barryvdh/laravel-debugbar,它非常整洁.您可以阅读有关如何在其存储库中安装的说明.

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


Laravel 3

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

DB::last_query();
Run Code Online (Sandbox Code Playgroud)

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

  • 这似乎不适用于L4上的Eloquent模型.当我执行Model :: find($ id)并执行DB :: getQueryLog()时返回空数组().知道如何获得Eloquent模型的查询吗? (4认同)
  • 您的Laravel 4代码不起作用.我得到了这个`ErrorException`:警告:`call_user_func_array()`期望参数1是一个有效的回调,类`Illuminate\Database\MySqlConnection`没有方法`getQueryList`. (2认同)

dua*_*led 31

您可以通过设置启用Laravel 3中的" Profiler "

'profiler' => true,
Run Code Online (Sandbox Code Playgroud)

在你application/config/application.php和你的application/config/database.php

这样可以在每页底部显示一个栏.它的一个功能是列出执行的查询以及每个查询所花费的时间.

在此输入图像描述

  • 请注意,在Laravel 4中,不包含Profiler,您必须自己安装(例如使用composer).请参阅[此SO问题](http://stackoverflow.com/questions/14536165/get-the-query-executed-in-laravel-3-4). (14认同)

Jam*_*yer 24

对于Eloquent你可以这样做:

$result->getQuery()->toSql();
Run Code Online (Sandbox Code Playgroud)

但是您需要从查询中删除" - > get()"部分.


Zna*_*kus 17

我建议使用Chrome扩展发条与Laravel包https://github.com/itsgoingd/clockwork.它易于安装和使用.

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

在此输入图像描述


小智 16

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


    public static function q($all = true) 
    {
        $queries = DB::getQueryLog();

        if($all == false) {
            $last_query = end($queries);
            return $last_query;
        }

        return $queries;
    }

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

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

dd(DBH::q()); 
Run Code Online (Sandbox Code Playgroud)

这是我得到的输出: 在此输入图像描述

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

  • `如果($all == false)`?为什么不简单地使用 `if(!$all)` (2认同)

mis*_*eka 14

对于Laraver 4来说

DB::getQueryLog()
Run Code Online (Sandbox Code Playgroud)


小智 14

这是一个快速的Javascript代码段,您可以将其放到主页面模板上.只要包含它,所有查询都将输出到浏览器的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>
Run Code Online (Sandbox Code Playgroud)


Bry*_*yan 10

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));
    }
Run Code Online (Sandbox Code Playgroud)

在标题中,使用:

     use DB;
     use Illuminate\Support\Facades\Log;
Run Code Online (Sandbox Code Playgroud)

输出看起来像这样(默认日志文件是laravel.log):

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

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


Sna*_*hot 7

您还可以使用以下方法侦听查询事件:

DB::listen(function($sql, $bindings, $time)
{
    var_dump($sql);
});
Run Code Online (Sandbox Code Playgroud)

请参阅从文档中的信息在这里监听查询活动


小智 6

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

DB::table('tablename')->toSql();
Run Code Online (Sandbox Code Playgroud)

或更多涉及:

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


Man*_*ill 5

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

\DB::enableQueryLog();
Run Code Online (Sandbox Code Playgroud)