[翻译] 快速导出 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 协议》,转载必须注明作者和本文链接
推荐文章: