本地作用域排序相关

This commit is contained in:
fthvgb1 2018-01-01 15:22:14 +08:00
parent 85291df5b3
commit 644dfb0896
5 changed files with 40 additions and 7 deletions

View File

@ -4,12 +4,13 @@ namespace App\Http\Controllers;
use App\Models\Category; use App\Models\Category;
use App\Models\Topic; use App\Models\Topic;
use Illuminate\Http\Request;
class CategoriesController extends Controller class CategoriesController extends Controller
{ {
public function show(Category $category) public function show(Category $category, Request $request)
{ {
$topics = Topic::where('category_id', $category->id)->with('user', 'category')->paginate(); $topics = Topic::where('category_id', $category->id)->withOrder($request->order)->with('user', 'category')->paginate();
return view('topics.index', compact('topics', 'category')); return view('topics.index', compact('topics', 'category'));
} }
} }

View File

@ -4,6 +4,7 @@ namespace App\Http\Controllers;
use App\Http\Requests\TopicRequest; use App\Http\Requests\TopicRequest;
use App\Models\Topic; use App\Models\Topic;
use Illuminate\Http\Request;
class TopicsController extends Controller class TopicsController extends Controller
{ {
@ -12,9 +13,9 @@ class TopicsController extends Controller
$this->middleware('auth', ['except' => ['index', 'show']]); $this->middleware('auth', ['except' => ['index', 'show']]);
} }
public function index() public function index(Request $request, Topic $topic)
{ {
$topics = Topic::with('user', 'category')->paginate(); $topics = $topic->with('user', 'category')->withOrder($request->order)->paginate();
return view('topics.index', compact('topics')); return view('topics.index', compact('topics'));
} }

View File

@ -2,7 +2,7 @@
namespace App\Models; namespace App\Models;
class Category extends BaseModel class Category extends Model
{ {
protected $guarded = ['id']; protected $guarded = ['id'];

View File

@ -7,6 +7,35 @@ class Topic extends Model
protected $fillable = ['"title', 'body', 'user_id', 'category_id', 'reply_count', 'view_count', 'last_reply_user_id', 'order', 'excerpt', 'slug']; protected $fillable = ['"title', 'body', 'user_id', 'category_id', 'reply_count', 'view_count', 'last_reply_user_id', 'order', 'excerpt', 'slug'];
public function scopeWithOrder($query, $order)
{
// 不同的排序,使用不同的数据读取逻辑
switch ($order) {
case 'recent':
$query = $this->recent();
break;
default:
$query = $this->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');
}
public function user() public function user()
{ {
return $this->belongsTo(User::class); return $this->belongsTo(User::class);

View File

@ -16,8 +16,10 @@
<div class="panel-heading"> <div class="panel-heading">
<ul class="nav nav-pills"> <ul class="nav nav-pills">
<li role="presentation" class="active"><a href="#">最后回复</a></li> <li role="presentation" class="{{active_class(!if_query('order','recent'))}}"><a
<li role="presentation"><a href="#">最新发布</a></li> href="{{Request::url()}}?order=default">最后回复</a></li>
<li role="presentation" class="{{active_class(if_query('order','recent'))}}"><a
href="{{Request::url()}}?order=recent">最新发布</a></li>
</ul> </ul>
</div> </div>