- 模型层定义方法,加前缀
scopepublic function scopeWithOrder($query, $order)
{
switch ($order) {
case 'recent':
$query->recent();
break;
default:
$query->recentReplied();
break;
}
return $query->with('user', 'category');
}
public function scopeRecentReplied($query)
{
return $query->orderBy('updated_at', 'desc');
}
public function scopeRecent($query)
{
return $query->orderBy('created_at', 'desc');
}
- 控制器层通过模型实例调用方法,不用加
scope
public function index(Request $request, Topic $topic)
{
$topics = $topic->withOrder($request->order)->paginate(20);
return view('topics.index', compact('topics'));
}
- 关于方法中的参数
$query ,查看Api文档了解是 scope 定义的方法有俩个参数,一个是 Builder、一个是 Model。
在 Eloquent 模型方法前加上一个 scope 前缀,作用域总是返回 查询构建器。在调用 scope 作用域的方法时,通过返回的构建器来拼接成完整的查询条件。
https://laravel.com/api/5.7/Illuminate/Database/Eloquent/Scope.html