- 在模型端创建一个封装的查询或写入方法,方便控制器端等调用;
2. 比如,封装一个筛选所有性别为男的查询,并且只显示部分字段 5 条;
3. 方法名规范:前缀 scope,后缀随意,调用时直接把后缀作为参数使用; public function scopeGenderMale($query)
{
$query->where('gender', '男') ->field('id,username,gender,email')->limit(5);
}
- 在控制器端,我们我们直接调用并输出结果即可;
public function queryScope()
{
$result = UserModel::scope('gendermale')->select();
//$result = UserModel::gendermale()->select();
return json($result);
}
- 也可以实现多个查询封装方法连缀调用,比如找出邮箱 xiao 并大于 80 分的;
public function scopeEmailLike($query, $value)
{
$query->where('email', 'like', '%'.$value.'%');
}
public function scopePriceGreater($query, $value)
{
$query->where('price', '>', 80);
}
$result = UserModel::emailLike('xiao')->priceGreater(80) ->select();
- 查询范围只能使用 find()和 select()两种方法;
7. 全局范围查询,就是在此模型下不管怎么查询都会加上全局条件; //全局范围查询
protected function base($query)
{
$query->where('status', 1);
}
- 在定义了全局查询后,如果某些不需要全局查询可以使用 useGlobalScope 取消;
UserModel::useGlobalScope(false)
- 当然,设置为 true,则开启全局范围查询,注意:这个方法需要跟在::后面;
UserModel::useGlobalScope(true)
模型输出方式
- 通过模版进行数据输出;
public function view()
{
$user = UserModel::get(21);
$this->assign('user', $user);
return $this->fetch();
}
- 根据错误提示,可以创建相对应的模版,然后进行数据显示;
{$user.username}.
{$user.gender}.
{$user.email}
- 使用 toArray()方法,将对象按照数组的方式输出;
$user = UserModel::get(21);
print_r($user->toArray());
- 和之前的数据集一样,它也支持 hidden、append、visible 等方法;
print_r($user->hidden(['password,update_time'])->toArray());
- toArray()方法也支持 all()和 select()等列表数据;
print_r(UserModel::select()->toArray());
- 使用 toJson()方法将数据对象进行序列化操作,也支持 hidden 等方法;
print_r($user->toJson());