Pat*_*iel 178 php orm laravel eloquent laravel-query-builder
如何使用Laravel Query Builder或Eloquent ORM在Laravel 3/4中检索原始执行的SQL查询?
例如,像这样:
DB::table('users')->where_status(1)->get();
Run Code Online (Sandbox Code Playgroud)
要么:
(posts (id, user_id, ...))
User::find(1)->posts->get();
Run Code Online (Sandbox Code Playgroud)
否则,至少我如何保存执行到laravel.log的所有查询?
rmo*_*bis 318
在Laravel 4及更高版本中,您必须调用DB::getQueryLog()以获取所有运行查询.
$queries = DB::getQueryLog();
$last_query = end($queries);
Run Code Online (Sandbox Code Playgroud)
或者您可以下载分析器包.我推荐barryvdh/laravel-debugbar,它非常整洁.您可以阅读有关如何在其存储库中安装的说明.
Laravel 5用户注意事项:DB::enableQueryLog()在执行查询之前,您需要调用.在运行查询的行上方或在中间件内.
在Laravel 3中,您可以从Eloquent调用类last_query上的静态方法的模型中获取最后执行的查询DB.
DB::last_query();
Run Code Online (Sandbox Code Playgroud)
但是,这需要您启用该profiler选项application/config/database.php.或者,正如@dualed所提到的,您可以启用profiler选项,in application/config/application.php或call DB::profile()来获取当前请求中运行的所有查询及其执行时间.
dua*_*led 31
您可以通过设置启用Laravel 3中的" Profiler "
'profiler' => true,
Run Code Online (Sandbox Code Playgroud)
在你application/config/application.php和你的application/config/database.php
这样可以在每页底部显示一个栏.它的一个功能是列出执行的查询以及每个查询所花费的时间.

Jam*_*yer 24
对于Eloquent你可以这样做:
$result->getQuery()->toSql();
Run Code Online (Sandbox Code Playgroud)
但是您需要从查询中删除" - > get()"部分.
Zna*_*kus 17
我建议使用Chrome扩展发条与Laravel包https://github.com/itsgoingd/clockwork.它易于安装和使用.
Clockwork是用于PHP开发的Chrome扩展,通过新面板扩展开发人员工具,提供用于调试和分析PHP脚本的各种信息,包括有关请求,标题,GET和POST数据,cookie,会话数据,数据库查询的信息,路由,应用程序运行时的可视化等.Clockwork包括对基于Laravel 4和Slim 2的应用程序的开箱即用支持,您可以通过可扩展的API添加对任何其他或自定义框架的支持.

小智 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());
Run Code Online (Sandbox Code Playgroud)
这是我得到的输出:

如果您想知道,我使用Kint进行dd()格式化. http://raveren.github.io/kint/
小智 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>
Run Code Online (Sandbox Code Playgroud)
Bry*_*yan 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));
}
Run Code Online (Sandbox Code Playgroud)
在标题中,使用:
use DB;
use Illuminate\Support\Facades\Log;
Run Code Online (Sandbox Code Playgroud)
输出看起来像这样(默认日志文件是laravel.log):
[2015-09-25 12:33:29] testing.DEBUG:查询0:{"查询":"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);
});
Run Code Online (Sandbox Code Playgroud)
请参阅从文档中的信息在这里下监听查询活动
小智 6
使用查询日志并不能为您提供正在执行的RAW查询,尤其是在存在绑定值的情况下.这是获取原始sql的最佳方法:
DB::table('tablename')->toSql();
Run Code Online (Sandbox Code Playgroud)
或更多涉及:
$query = Article::whereIn('author_id', [1,2,3])->orderBy('published', 'desc')->toSql();
dd($query);
Run Code Online (Sandbox Code Playgroud)
如果您使用的是Laravel 5,则需要在查询之前或在中间件上插入以下代码:
\DB::enableQueryLog();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
172343 次 |
| 最近记录: |