关于性能问题
$ composer require "barryvdh/laravel-debugbar:~3.2" --dev
安装好debugbar, 这个是laravel的性能诊断工具
publish一个配置文件.
$ php artisan vendor:publish --provider="BarryvdhDebugbarServiceProvider"
config/debugbar.php
修改成:
'enabled' => env('APP_DEBUG', false),
刷新view, 发现多了一个debugger条
发现DB那个部分, 竟然一页有33个查询语句, 是不是很沙雕?
用预加载功能解决问题, 在TopicsController的index方法中, 先搜索出join查询后的结果, 输出到view
$topics = Topic::with('user', 'category')->paginate(30); return view('topics.index', compact('topics'));
这个就避免了N+1问题, 缩短了查询数量, 节省了响应时间. 妈的智障, 这个操作...直接写sql不好么?
CSS让导航栏的某些页面active起来, 让用户知道他们目前访问的是哪个category, 需要一个第三方的包, hieu-le/active
$ composer require "hieu-le/active:~3.5"
在helpers里面, 新建一个辅助函数:
function category_nav_active($category_id) { return active_class((if_route('categories.show') && if_route_param('category', $category_id))); }
在view里面:
<li class="nav-item {{ active_class(if_route('topics.index')) }}"> <a class="nav-link" href="{{ route('topics.index') }}">话题</a> </li> <li class="nav-item {{ category_nav_active(1) }}"> <a class="nav-link" href="{{ route('categories.show', 1) }}">分享</a> </li> <li class="nav-item {{ category_nav_active(2) }}"> <a class="nav-link" href="{{ route('categories.show', 2) }}">教程</a> </li> <li class="nav-item {{ category_nav_active(3) }}"> <a class="nav-link" href="{{ route('categories.show', 3) }}">问答</a> </li> <li class="nav-item {{ category_nav_active(4) }}"> <a class="nav-link" href="{{ route('categories.show', 4) }}">公告</a> </li>
排序
在要排序的Model里面, 例如topic,
public function scopeWithOrder($query, $order) { // 不同的排序,使用不同的数据读取逻辑 switch ($order) { case 'recent': $query->recent(); break; default: $query->recentReplied(); break; } // 预加载防止 N+1 问题 return $query->with('user', 'category'); } public function scopeRecentReplied($query) { // 当话题有新回复时,我们将编写逻辑来更新话题模型的 reply_count 属性, // 此时会自动触发框架对数据模型 updated_at 时间戳的更新 return $query->orderBy('updated_at', 'desc'); } public function scopeRecent($query) { // 按照创建时间排序 return $query->orderBy('created_at', 'desc'); }
增加不同的排序方法, 为啥排序之类sql逻辑, 要在model里面做呢? 不理解...