- 模型层定义方法,加前缀
scope
public 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