如何使用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?
Answers:
在Laravel 4和更高版本中,您必须调用DB::getQueryLog()
以获取所有已运行的查询。
$queries = DB::getQueryLog();
$last_query = end($queries);
或者,您可以下载探查器软件包。我建议使用barryvdh / laravel-debugbar,它非常简洁。您可以阅读有关如何在其存储库中进行安装的说明。
Laravel 5用户注意事项:DB::enableQueryLog()
执行查询之前,您需要先致电。在运行查询的行的上方或在中间件内部。
在Laravel 3中,您可以从Eloquent
调用类last_query
上静态方法的模型中获取最后执行的查询DB
。
DB::last_query();
但是,这要求您在中启用该profiler
选项application/config/database.php
。或者,如@dualed所述,您可以启用profiler
in application/config/application.php
或调用选项,DB::profile()
以使所有查询在当前请求及其执行时间中运行。
ErrorException
警告:警告:call_user_func_array()
期望参数1是有效的回调,类Illuminate\Database\MySqlConnection
没有方法getQueryList
。
getQueryLog
。立即修复。谢谢!
我建议将Chrome扩展程序Clockwork与Laravel软件包一起使用https://github.com/itsgoingd/clockwork。它易于安装和使用。
Clockwork是用于PHP开发的Chrome扩展程序,它在开发人员工具的新面板中进行了扩展,提供了可用于调试和配置PHP脚本的各种信息,包括有关请求,标头,GET和POST数据,cookie,会话数据,数据库查询,路线,应用程序运行时的可视化等。Clockwork包括对基于Laravel 4和Slim 2的应用程序的开箱即用支持,您可以通过可扩展的API添加对任何其他或自定义框架的支持。
由于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/
if($all == false)
?为什么不简单if(!$all)
这是一个快速的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::getQueryLog()
返回数组,因此无需将其用“” 括起来。json_encode
将相应地进行翻译。
请注意,这是一种过程方法,我使用它来进行快速调试
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特有的-也许有人可以对此发表评论。
或作为laravel 3 profiler的替代品,您可以使用:
https://github.com/paulboco/profiler 或 https://github.com/barryvdh/laravel-debugbar
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));
为了获得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中获取了参考。