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

Php 获取在Laravel 3/4中执行的查询,php,laravel,orm,eloquent,laravel-query-builder,Php,Laravel,Orm,Eloquent,Laravel Query Builder,如何使用Laravel query Builder或Eloquent ORM在Laravel 3/4中检索原始执行的SQL查询 例如,类似这样的内容: DB::table('users')->where_status(1)->get(); dd(DBH::q()); 或: 否则,至少如何将执行的所有查询保存到laravel.log?您可以通过设置 'profiler' => true, 在application/config/application.php和applic

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

例如,类似这样的内容:

DB::table('users')->where_status(1)->get();
dd(DBH::q()); 
或:

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

您可以通过设置

'profiler' => true,
application/config/application.php
application/config/database.php

这将在每页底部启用一个栏。它的一个特性是列出执行的查询以及每个查询花费的时间

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

$queries = DB::getQueryLog();
$last_query = end($queries);
或者您可以下载一个探查器包。我推荐,这很好。您可以阅读有关如何在其中安装的说明

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


拉维尔3号 在Laravel 3中,您可以从调用
DB
类上的静态方法
last\u query
elount
模型中获取最后执行的查询

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

对于Laraver 4,它是

DB::getQueryLog()

由于探查器尚未在Laravel 4中运行,因此我创建了这个helper函数来查看正在生成的SQL:

public static function q($all = true) { $queries = DB::getQueryLog(); if($all == false) { $last_query = end($queries); return $last_query; } return $queries; } 以下是我得到的输出:

如果您想知道,我使用Kint进行dd()格式设置。

这里是一个快速的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>

var查询={{json_encode(DB::getQueryLog())};
console.log('/*******************************************************数据库查询'/*****************************************/');
控制台日志(“”);
forEach(函数(查询){
console.log(“”+query.time+'|'+query.query+'|'+query.bindings[0]);
});
控制台日志(“”);
console.log(“/*****************************************************************************************************/”);

或作为laravel 3探查器的替代品,您可以使用:


Loic Sharma SQL分析器确实支持Laravel 4,我刚刚安装了它。说明。步骤如下:

  • 在require部分添加“loic sharma/profiler”:“1.1.*” 在composer.json中
  • 在控制台中执行自更新=>
    php composer.phar自更新
  • 在控制台中执行composer update=>
    php composer.phar更新loic sharma/profiler
    `
  • 在中的提供程序数组中添加
    'Profiler\ProfilerServiceProvider',
    app.php
  • 在中添加
    'Profiler'=>'Profiler\Facades\Profiler',
    app.php中的别名数组
  • 在控制台中运行php artisan config:publish loic sharma/profiler

  • 您还可以使用以下命令侦听查询事件:

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

    请参阅文档中“侦听查询事件”下的信息,了解您可以执行的雄辩操作:

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

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

    我建议在Laravel包中使用Chrome扩展。它易于安装和使用

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


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

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

    将此代码段放在任何位置,例如
    start/global.php
    中。它会将查询写入信息日志(
    storage/log/laravel.log
    )。

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

    DB::table('tablename')->toSql();
    
    或更多涉及:

    $query = Article::whereIn('author_id', [1,2,3])->orderBy('published', 'desc')->toSql();
    dd($query);
    
    Event::listen('light.query',函数($sql,$param)
    {
    \日志::信息($sql.),带[”.join(“,”,$param)。“]
    \n”); });

    将其放在global.php中,它将记录您的sql查询。

    上次查询打印

    $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);
    
    拉维尔3号 另一种方法是:

    #config/database.php
    
    'profiler' => true
    
    对于所有查询结果:

    print_r(DB::profiler());
    
    关于最后结果:

    print_r(DB::last_query());
    

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

    $student = DB::table('student')->get();
    $query = DB::getQueryLog();
    $lastQuery = end($query);
    print_r($lastQuery);
    
    我参考了拉威尔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:{“查询”:“从中选择* “用户”,其中('user_id'=?),“绑定”:[“9”],“时间”:0.23}

    ***我知道这个问题指定了Laravel 3/4,但在搜索一般答案时会出现此页面。拉威尔的新手可能不知道两者之间有什么区别
        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;
    
    \DB::enableQueryLog();