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

时间:2013-01-26 10:44:09

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

如何使用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?

21 个答案:

答案 0 :(得分:315)

Laravel 4 +

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

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

或者您可以下载探查器包。我推荐barryvdh/laravel-debugbar,这很漂亮。您可以阅读有关如何在repository中安装的说明。

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


Laravel 3

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

DB::last_query();

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

答案 1 :(得分:30)

您可以通过设置

在Laravel 3中启用“ Profiler
'profiler' => true,

application/config/application.phpapplication/config/database.php

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

enter image description here

答案 2 :(得分:24)

对于Eloquent你可以这样做:

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

但你需要删除" - > get()"部分来自您的查询。

答案 3 :(得分:17)

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

  

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

enter image description here

答案 4 :(得分: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()); 

以下是我得到的输出: enter image description here

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

答案 5 :(得分:14)

对于Laraver 4来说,它是

DB::getQueryLog()

答案 6 :(得分: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>

答案 7 :(得分: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));
    }
在标题中

,请使用:

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

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

  

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

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

答案 8 :(得分:7)

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

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

查看倾听查询事件

下的文档here中的信息

答案 9 :(得分:6)

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

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

或更多涉及:

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

答案 10 :(得分:4)

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

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

答案 11 :(得分:4)

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

\DB::enableQueryLog();

答案 12 :(得分:3)

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

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)。

答案 13 :(得分:3)

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

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

答案 14 :(得分:2)

上次查询打印

$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 :(得分:2)

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

  1. 在require部分添加"loic-sharma/profiler": "1.1.*" 在composer.json中
  2. 执行自我更新=&gt;控制台中的php composer.phar self-update
  3. 执行composer update =&gt;控制台中也php composer.phar update loic-sharma/profiler `
  4. 在提供程序数组中添加'Profiler\ProfilerServiceProvider', app.php
  5. 在{li>中添加'Profiler' => 'Profiler\Facades\Profiler', 在app.php中也使用aliasses数组
  6. 在控制台中运行php artisan config:publish loic-sharma/profiler

答案 16 :(得分:1)

L4单线

(写入查询):

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

答案 17 :(得分:0)

Laravel 3

另一种方法是:

#config/database.php

'profiler' => true

对于所有查询结果:

print_r(DB::profiler());

最后结果:

print_r(DB::last_query());

答案 18 :(得分:0)

要在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

答案 19 :(得分:0)

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

答案 20 :(得分:0)

在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 文件中查看所有查询。