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

175400 次浏览

您可以在 Laravel3中通过设置

'profiler' => true,

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

这样就可以在每个页面的底部设置一个栏。它的一个特性是列出已执行的查询以及每个查询所花费的时间。

enter image description here

幼虫4 +

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

在 Laravel4和更高版本中,您必须调用 DB::getQueryLog()来获得所有运行查询。

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

或者您可以下载一个分析器软件包。我建议使用 Barryvdh/laravel-debug,它非常简洁。您可以阅读有关如何在其 储存库中安装的说明。


Laravel 3

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

DB::last_query();

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

对于 Larver 4来说

DB::getQueryLog()

因为分析器在 幼虫4号中还没有出来,所以我创建了这个 helper 函数来查看正在生成的 SQL:



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


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


return $queries;
}


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

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

dd(DBH::q());

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

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

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

或者作为 Laravel3分析器的替代品,你可以使用:

Https://github.com/paulboco/profiler 或者 Https://github.com/barryvdh/laravel-debugbar

Loic Sharma SQL 分析器确实支持 Laravel 4,我刚刚安装了它。指令 列在这里。步骤如下:

  1. 在请求部分中添加 "loic-sharma/profiler": "1.1.*" 作曲家 Json
  2. 在控制台中执行 self-update = > php composer.phar self-update
  3. 在控制台中也执行作曲家 update = > php composer.phar update loic-sharma/profiler `
  4. 中的提供程序数组中添加 'Profiler\ProfilerServiceProvider', App.php
  5. 中添加 'Profiler' => 'Profiler\Facades\Profiler', 在 app.php 中也是别名数组
  6. 在控制台中运行 php artisan config:publish loic-sharma/profiler

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

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

请参阅 监听查询事件下面的文档 给你中的信息

对于雄辩,你只需要做:

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

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

我推荐使用 Chrome 扩展 真准时和 Laravel 软件包 https://github.com/itsgoingd/clockwork,它很容易安装和使用。

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

enter image description here

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

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

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

或更多涉及:

$query = Article::whereIn('author_id', [1,2,3])->orderBy('published', 'desc')->toSql();
dd($query);
Event::listen('illuminate.query', function($sql, $param)
{
\Log::info($sql . ", with[" . join(',', $param) ."]<br>\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);

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

我参考了 http://www.tutsway.com/how-to-get-the-last-executed-query-in-laravel.php

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-2512:33:29] testing.DEBUG: Query 0: {“ Query”: “ select * from ‘ users’where (‘ user _ id’= ?)”,“ bindings”: [“9”] ,“ time”: 0.23}

我知道这个问题指定了 Laravel 3/4,但是这个页面是在搜索一般答案时出现的。初到 Laravel 的人可能不知道这两个版本之间存在差异。因为我从来没有看到 DD::enableQueryLog()提到的任何答案,我通常找到的,它是特定的 到 Laravel 5-也许有人可以评论这一点。

如果您正在使用 Laravel5,您需要在查询之前或在中间件上插入:

\DB::enableQueryLog();

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

L4一行

(写查询) :

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

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