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


182

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


laravel 5呢?
Chaudhry Waqas,2015年

Answers:


318

Laravel 4+

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

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

或者,您可以下载探查器软件包。我建议使用barryvdh / laravel-debugbar,它非常简洁。您可以阅读有关如何在其存储库中进行安装的说明。

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


Laravel 3

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

DB::last_query();

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


2
您的Laravel 4代码不起作用。我得到这样的ErrorException警告:警告:call_user_func_array()期望参数1是有效的回调,类Illuminate\Database\MySqlConnection没有方法getQueryList
duality_

我不好,正确的方法是getQueryLog。立即修复。谢谢!
rmobis

奇怪...我得到的last_query()未定义在查询对象错误上。我只是在呼吁一个未实例化的口才模型。
Aditya MP

1
对于Laravel 3,实际上是DB :: last_query(); 您还需要在application / config / database.php中将“配置文件”设置为true
Dan Smart

4
这似乎不适用于L4上的Eloquent模型。当我执行Model :: find($ id)并执行DB :: getQueryLog()时,返回空白array()。任何想法如何获取口才模型的查询?
阿比舍克

31

您可以通过设置在Laravel 3中启用“ 探查器

'profiler' => true,

在你application/config/application.phpapplication/config/database.php

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

在此处输入图片说明


14
请注意,在Laravel 4中,不包括Profiler,您必须自己安装(例如,使用作曲家)。看到这个问题
duality_


24

对于Eloquent,您可以执行以下操作:

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

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


17

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

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

在此处输入图片说明


16

由于Laravel 4中尚未提供探查器,因此我创建了此帮助器函数以查看正在生成的SQL:

    公共静态函数q($ all = true) 
    {
        $ queries = DB :: getQueryLog();

        if($ all == false){
            $ last_query =结束($ queries);
            返回$ last_query;
        }

        返回$查询;
    }

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

我将此类函数保留在名为DBH.php的类中(Database Helper的缩写),因此可以从以下任何地方调用它:

dd(DBH::q()); 

这是我得到的输出: 在此处输入图片说明

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


1
if($all == false)?为什么不简单if(!$all)
toesslab '16


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>

我认为您需要在{{json_encode ...}}部分周围加上“”
mydoglixu 2015年

@mydoglixu由于DB::getQueryLog()返回数组,因此无需将其用“” 括起来。json_encode将相应地进行翻译。
rmobis

@mobis-我的意思是,您需要在{{...}}之外添加“”,以便javascript不会引发错误。像这样:var query =“ json output”;
mydoglixu

@mydoglixu不需要,因为JSON数组(或对象)是有效的JavaScript。如果这样做的话,它会破裂。
rmobis

@mobis-哦,是的
mydoglixu 2015年

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:{“ query”:“从'users'中选择*,其中('user_id'=?)”,“ bindings”:[“ 9”] ,“时间”:0.23}

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


7

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

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

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


6

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

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

或更多涉及:

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

5

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

\DB::enableQueryLog();


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


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

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


2

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

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

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


0

Laravel 3

另一种方法是:

#config/database.php

'profiler' => true

对于所有查询结果:

print_r(DB::profiler());

对于最后的结果:

print_r(DB::last_query());

0

为了获得laravel中最后执行的查询,我们将使用DB::getQueryLog()laravel函数返回所有已执行的查询。为了获得最后的查询,我们将使用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_已接受的答案提供任何新知识。
JaakKütt2015年

0

有一个非常简单的方法,从您的laravel查询中只需重命名任何列名,它就会向您显示查询错误。.::)


快速黑客方式。在生产中没有用,但在开发模式下在某些情况下很好。
而是
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.