[翻译] 快速导出 Laravel 的查询语句
Eloquent 是处理关系模型的神兵利器。你可以用它设计模型,缓加载子记录。
例如,假设你需要获取一个用户:
User::where('name', 'Eric')->first();
然后在视图中可能有以下操作:
@foreach ($user->posts as $post)
因为 posts 在初始加载时没有包含 User Eloquent,所以需要为每一条记录再执行一次查询,以取出关联的 User 。
解决方案如下:
User::where('name', 'Eric')->with('posts')->first();
为了对查询效率保持警觉,你可能会在本地开发环境启用 Laravel Debugbar 或者 Laravel database profiler 这两个重型工具,它们会打印所有的查询语句,并且在超出控制时给你提醒。
不过,在 Reddit 的 Laravel 频道上,用户 magkopian 共享了另一种 快速的解决方案,以查看页面上所有运行的查询。
在 AppServiceProvider.php 的 boot 方法中添加如下内容:
use DB;
use Event;
//..
public function boot()
{
if (env('APP_ENV') === 'local') {
DB::connection()->enableQueryLog();
Event::listen('kernel.handled', function ($request, $response) {
if ( $request->has('sql-debug') ) {
$queries = DB::getQueryLog();
dd($queries);
}
});
}
}
现在,你在开发时往任何 URL 后追加 ?sql-debug=1 ,就可以打印出所有查询。
让我们再做个小小的改进,使用帮助函数 dump 替换掉 dd ,以获得格式更友好的输出:
看起来似乎不那么优雅,但是当我想看看特定页面究竟发生了什么,又不想安装专用的包的时候,这个技巧很好的解决了问题。
本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由 Summer
于 9年前 加精
关于 LearnKu
已集成进我的开发基础框架中 :+1:
lumen 中使用 Http Kernel 不太一样,没有扔
kernel.handled事件因为 Lumen 没有对应的事件,可以用这样的方式来做:
当然你需要开启 facade:
这个很好用,我已经应用到项目里面了。。棒棒的。
有一个问题,就是会写大量的日志, 比较蛋疼。
用 \DB::listen 比较好
感觉很牛逼.收藏先!
5.4 The kernel.handled event is now an object based event using the Illuminate\Foundation\Http\Events\RequestHandled class.
也可以參考使用:https://packagist.org/packages/recca0120/l...
提供的除錯工具即可以看到 Queries
@lijinma 上面的代码,去掉这一句吧
@权 是
dd()用 laravel-debugbar 扩展包不就好了吗
我是这样来做的,监听 QueryExecuted 这个事件
遇到困惑的地方直接去看日志
@Hanccc 不是输出的原因
@权 不用dd()很有可能会把输出隐藏在标签内,这是个可能的原因