如何使用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?
答案 0 :(得分:315)
在Laravel 4及更高版本中,您必须致电DB::getQueryLog()
以获取所有已运行的查询。
$queries = DB::getQueryLog();
$last_query = end($queries);
或者您可以下载探查器包。我推荐barryvdh/laravel-debugbar,这很漂亮。您可以阅读有关如何在repository中安装的说明。
请注意Laravel 5用户:在执行查询之前,您需要调用DB::enableQueryLog()
。在运行查询的行之上或在中间件内部。
在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.php
和application/config/database.php
这样可以在每页底部显示一个栏。它的一个功能是列出执行的查询以及每个查询花费的时间。
答案 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。
答案 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());
以下是我得到的输出:
如果您想知道,我使用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)
请注意,这是过程方法,我将其用于快速调试
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。步骤如下:
"loic-sharma/profiler": "1.1.*"
在composer.json中php composer.phar self-update
。php composer.phar update loic-sharma/profiler
`'Profiler\ProfilerServiceProvider',
app.php 'Profiler' => 'Profiler\Facades\Profiler',
在app.php中也使用aliasses数组php artisan config:publish loic-sharma/profiler
答案 16 :(得分:1)
(写入查询):
$q=\DB::getQueryLog();dd(end($q));
答案 17 :(得分:0)
另一种方法是:
#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