20.模型查询范围和输出

```php
一.模型查询范围

1.在模型端创建一个封装的查询或写入方法,方便控制器端等调用;

2.比如,封装一个筛选所有性别为男的查询,并且只显示部分字段 5 条;

3.方法名规范:前缀 scope,后缀随意,调用时直接把后缀作为参数使用;

publicfunctionscopeGenderMale($query)

{

$query->where('gender','男')->field('id,username,gender,email')
->limit(5);

}

4.在控制器端,我们我们直接调用并输出结果即可;

publicfunctionqueryScope()

{

$result=UserModel::scope('gendermale')->select(); //$result=UserModel::gendermale()->select(); returnjson($result);

}

5.也可以实现多个查询封装方法连缀调用,比如找出邮箱 xiao 并大于 80 分的;

publicfunctionscopeEmailLike($query,$value)

{

$query->where('email','like','%'.$value.'%');

}

publicfunctionscopePriceGreater($query,$value)

{

$query->where('price','>',80);

}

$result=UserModel::emailLike('xiao')->priceGreater(80) ->select();

6.查询范围只能使用 find()和 select()两种方法;

7.全局范围查询,就是在此模型下不管怎么查询都会加上全局条件;

//全局范围查询 protectedfunctionbase($query)

{

$query->where('status',1);

}

8.在定义了全局查询后,如果某些不需要全局查询可以使用 useGlobalScope 取消;

UserModel::useGlobalScope(false)

9.当然,设置为 true,则开启全局范围查询,注意:这个方法需要跟在::后面;

UserModel::useGlobalScope(true)

二.模型输出方式

1.通过模版进行数据输出;
public function view()
{
$user = UserModel::get(21); $this->assign(‘user’, $user);
return $this->fetch();

}

2.根据错误提示,可以创建相对应的模版,然后进行数据显示;

{$user.username}. {$user.gender}. {$user.email}

3.使用 toArray()方法,将对象按照数组的方式输出;

$user=UserModel::get(21); print_r($user->toArray());

4.和之前的数据集一样,它也支持 hidden、append、visible 等方法; print_r($user->hidden([‘password,update_time’])->toArray());

5.toArray()方法也支持 all()和 select()等列表数据; print_r(UserModel::select()->toArray());

6.使用 toJson()方法将数据对象进行序列化操作,也支持 hidden 等方法; print_r($user->toJson());