如何使用 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 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 用户注意事项:您需要
DB::enableQueryLog()
在执行查询之前调用。在运行查询的行上方或中间件内部。
在 Laravel 4 及更高版本中,您必须调用DB::getQueryLog()
以获取所有已运行的查询。
$queries = DB::getQueryLog();
$last_query = end($queries);
或者,您可以下载分析器包。我推荐barryvdh/laravel-debugbar,它非常简洁。您可以阅读有关如何在其存储库中安装的说明。
Eloquent
在 Laravel 3 中,您可以从调用类last_query
上的静态方法的模型中获取最后执行的查询DB
。
DB::last_query();
但是,这需要您启用 中的profiler
选项application/config/database.php
。或者,正如@dualed 所提到的,您可以启用该profiler
选项,application/config/application.php
或者调用DB::profile()
以获取在当前请求中运行的所有查询及其执行时间。
您可以通过设置启用 Laravel 3 中的“ Profiler ”
'profiler' => true,
在你application/config/application.php
和application/config/database.php
这会在每个页面的底部启用一个栏。它的功能之一是列出执行的查询以及每个查询花费了多长时间。
对于 Eloquent,您可以这样做:
$result->getQuery()->toSql();
但是您需要从查询中删除“->get()”部分。
我建议使用带有 Laravel 包https://github.com/itsgoingd/clockwork的 Chrome 扩展Clockwork。它易于安装和使用。
Clockwork 是一个用于 PHP 开发的 Chrome 扩展,通过一个新面板扩展了开发者工具,提供了对调试和分析 PHP 脚本有用的各种信息,包括有关请求、标头、GET 和 POST 数据、cookie、会话数据、数据库查询的信息,路线,应用程序运行时的可视化等等。Clockwork 包括对基于 Laravel 4 和 Slim 2 的应用程序的开箱即用支持,您可以通过可扩展的 API 添加对任何其他或自定义框架的支持。
由于Laravel 4中还没有分析器,我创建了这个帮助函数来查看正在生成的 SQL:
公共静态函数 q($all = true) { $查询 = DB::getQueryLog(); 如果($all == 假){ $last_query = end($queries); 返回 $last_query; } 返回$查询; }
注意:如果您只需要最后一个 SQL 查询,请将$all标志设置为false 。
我将这类函数保存在一个名为 DBH.php(Database Helper 的缩写)的类中,这样我就可以像这样从任何地方调用它:
dd(DBH::q());
这是我得到的输出:
如果您想知道,我使用 Kint 进行 dd() 格式化。 http://raveren.github.io/kint/
对于 Laraver 4,它是
DB::getQueryLog()
这是一个快速的 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>
请注意,这是我用于快速调试的过程方法
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 - 也许有人可以对此发表评论。
您还可以使用以下方法侦听查询事件:
DB::listen(function($sql, $bindings, $time)
{
var_dump($sql);
});
在Listening For Query Events下查看文档中的信息
使用查询日志不会为您提供正在执行的实际 RAW 查询,尤其是在存在绑定值的情况下。这是获取原始 sql 的最佳方法:
DB::table('tablename')->toSql();
或更多参与:
$query = Article::whereIn('author_id', [1,2,3])->orderBy('published', 'desc')->toSql();
dd($query);
如果您使用的是 Laravel 5,则需要在查询之前或中间件上插入:
\DB::enableQueryLog();
或者作为 laravel 3 profiler 的替代品,您可以使用:
https://github.com/paulboco/profiler 或 https://github.com/barryvdh/laravel-debugbar
在 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
)。
Event::listen('illuminate.query', function($sql, $param)
{
\Log::info($sql . ", with[" . join(',', $param) ."]<br>\n");
});
把它放在 global.php 中,它会记录你的 sql 查询。
Loic Sharma SQL 分析器确实支持 Laravel 4,我刚刚安装了它。此处列出了说明。步骤如下:
"loic-sharma/profiler": "1.1.*"
在 composer.json 中添加 require 部分php composer.phar self-update
在控制台中执行自我更新 => 。php composer.phar update loic-sharma/profiler
也在控制台中执行 composer update => `'Profiler\ProfilerServiceProvider',
在 app.php 中添加提供者数组'Profiler' => 'Profiler\Facades\Profiler',
在 app.php 中添加别名数组php artisan config:publish loic-sharma/profiler
在控制台中运行最后查询打印
$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);
(写查询):
$q=\DB::getQueryLog();dd(end($q));
另一种方法是:
#config/database.php
'profiler' => true
对于所有查询结果:
print_r(DB::profiler());
最后的结果:
print_r(DB::last_query());
要获取 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。
有很简单的方法,从你的 laravel 查询中重命名任何列名,它会显示你的查询错误.. :)
在 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);
});
}
然后你可以在里面的laravel.log文件中看到所有的查询storage\logs\laravel.log