> ## 查询范围:把基础的查询条件封装成一个整体,在其他查询中可以直接调用这个条件整体进行查询
> 可以理解为把一串的链式操作定义为一个函数,查询的时候直接利用链式进行调用
### 查询范围定义
```
class User extends Model
{
// 定义名为thinkphp的查询范围
protected function scopeThinkphp($query)
{
$query->where('name','thinkphp')->field('id,name');
}
// 定义名为age的查询范围
protected function scopeAge($query)
{
$query->where('age','>',20)->limit(10);
}
}
```
### 查询范围的调用
```
// 查找name为thinkphp的用户(基于thinkphp查询范围)
User::scope('thinkphp')->find();
// 查找年龄大于20的10个用户(基于age查询范围)
User::scope('age')->select();
// 查找name为thinkphp的用户并且年龄大于20的10个用户(基于thinkphp和age查询范围)
User::scope('thinkphp,age')->select();
// 也可以直接使用闭包函数(这种用法没意义)
User::scope(function($query){
$query->where('age','>',20)->limit(10);
})->select();
// 动态调用(注意:查询范围必须在所有链式操作最前面调用,且后面必须为find或者select)
$user = new User;
// 查找name为thinkphp的用户(基于thinkphp查询范围)
$user->thinkphp()->get();
// 查找年龄大于20的10个用户(基于age查询范围)
$user->age()->all();
// 查找name为thinkphp的用户并且年龄大于20的10个用户(基于thinkphp和age查询范围)
$user->thinkphp()->age()->all();
```
### 传入参数的查询范围
```
// 定义方法
class User extends Model
{
protected function scopeAgeAbove($query, $lowest_age)
{
$query->where('age','>',$lowest_age)->limit(10);
}
}
// 调用方法(必须为驼峰调用,不能为age_above)
User::scope('ageAbove', 20)->select();
```
### 全局查询范围(模型中所有查询操作都会自动调用这个查询范围)
**全局查询范围方法在5.0.2版本之前必须定义为static静态方法**
```
class User extends Model
{
// 定义全局的查询范围
protected function base($query)
{
$query->where('status',1);
}
}
// 动态开关全局查询范围
// 关闭全局查询范围
User::useGlobalScope(false)->get(1);
// 开启全局查询范围
User::useGlobalScope(true)->get(2);
```