ChatGPT解决这个技术问题 Extra ChatGPT

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

如何使用 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 中呢?
@亚当尼克在这里:stackoverflow.com/questions/27753868/…

r
rmobis

拉拉维尔 4+

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

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

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

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

拉拉维尔 3

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

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 单线:$q=\DB::getQueryLog();dd(end($q));
我要成为这个页面的常客。
d
dualed

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

'profiler' => true,

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

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

https://i.stack.imgur.com/dJMPf.png


请注意,在 Laravel 4 中,Profiler 不包括在内,您必须自己安装它(例如使用 composer)。请参阅this SO question
first answer there 中对此进行了讨论。
J
JamesPlayer

对于 Eloquent,您可以这样做:

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

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


Z
Znarkus

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

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

https://i.stack.imgur.com/Hg1NG.png


T
The Alpha

由于 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()); 

https://i.stack.imgur.com/kE8wd.png

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


if($all == false)?为什么不简单地if(!$all)
m
misaizdaleka

对于 Laraver 4,它是

DB::getQueryLog()

r
rmobis

这是一个快速的 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 由于 DB::getQueryLog() 返回一个数组,因此无需用“”包围它。 json_encode 将相应地翻译它。
@mobis - 我的意思是您需要 {{ ... }} 之外的 "" 以便 javascript 不会引发错误。像这样: var queries = "json output";
@mydoglixu 你没有,因为 JSON 数组(或对象)是有效的 JavaScript。如果你这样做,它会破裂。
@mobis - 哦,是的,呃
B
Bryan

拉拉维尔 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"] “时间”:0.23}

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


S
SnapShot

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

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

请参阅 Listening For Query Events 下的文档 here 中的信息


o
omar j

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

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

或更多参与:

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

M
Mandeep Gill

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

\DB::enableQueryLog();

k
karelv

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

https://github.com/paulboco/profilerhttps://github.com/barryvdh/laravel-debugbar


a
aebersold

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


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

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


b
bicycle

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

在 composer.json 的 require 部分添加 "loic-sharma/profiler": "1.1.*" 在控制台中执行 self-update => php composer.phar self-update。在控制台中执行 composer update => php composer.phar update loic-sharma/profiler ` Add 'Profiler\ProfilerServiceProvider', in the provider array in app.php Add 'Profiler' => 'Profiler\Facades\Profiler',在 app.php 的 aliasses 数组中也在控制台中运行 php artisan config:publish loic-sharma/profiler


D
Dulitha K

最后查询打印

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

K
Kamil Kiełczewski

L4 单线

(写查询):

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


C
Community

拉拉维尔 3

另一种方法是:

#config/database.php

'profiler' => true

对于所有查询结果:

print_r(DB::profiler());

最后的结果:

print_r(DB::last_query());

D
Deenadhayalan Manoharan

要获取 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_ 已接受的答案所涵盖的内容提供任何新知识。
A
Aamir

有很简单的方法,从你的 laravel 查询中重命名任何列名,它会显示你的查询错误.. :)


快速hacky方式。在生产中没有用,但在开发模式下在某些情况下很好。
N
Nava Bogatee

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