Laravel Local Scope 作用域

2019-11-12 16:04:09 浏览数 (2)

前言

在项目中 经常会面对一些条件的查询,这些查询条件好些是相同的。scope可以实现这些相同条件的复用。

例如

某个需求是按category_id为条件作为筛选。

那么我们就可以在模型中定义scopeCategoryId方法。

代码语言:javascript复制
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);

看到了吗?

我们加入:CategoryIdKeyword方法即可。

所以就要引入我们下面要说的写法。

写法

1、命名方式

scope 自定义的方法名

2、传参

  • 第一个参数是查询生成器
  • 如果传入参数 那么可以生成动态的效果。如上面的:scopeCategoryId($query, $category_id = '')

3、返回值

无论内部你怎么写,最终都要返回查询构造器

0 人点赞