前言
在项目中 经常会面对一些条件的查询,这些查询条件好些是相同的。scope可以实现这些相同条件的复用。
例如
某个需求是按category_id
为条件作为筛选。
那么我们就可以在模型中定义scopeCategoryId
方法。
public function scopeCategoryId($query, $category_id = '')
{
if ($category_id != '') {
return $query->where('category_id', $category_id);
} else {
return $query;
}
}
再例如
在某个请求中我们需要按照关键字筛选,并且,URL中有字段key才去数据库查询和key有关的。没有的话就不查询。
那么一般情况下,如果用if来写,就要判断有key该sql语句加上where条件,没key就不加。
显然不如以下写法方便:
代码语言:javascript复制public function scopeKeyword($query, $kw = '')
{
if ($kw != '') {
return $query->where('title','like', '%' . $kw . '%');
} else {
return $query;
}
}
如下图:
使用
代码语言:javascript复制$snippets = Snippet::OrderBy('id', 'desc')->CategoryId($category_id)->Keyword($kw)->paginate(15);
看到了吗?
我们加入:CategoryId
和Keyword
方法即可。
所以就要引入我们下面要说的写法。
写法
1、命名方式
scope 自定义的方法名
2、传参
- 第一个参数是查询生成器
- 如果传入参数 那么可以生成动态的效果。如上面的:scopeCategoryId($query, $category_id = '')
3、返回值
无论内部你怎么写,最终都要返回查询构造器
。