模型查询范围

  1. 在模型端创建一个封装的查询或写入方法,方便控制器端等调用;
    2. 比如,封装一个筛选所有性别为男的查询,并且只显示部分字段 5 条;
    3. 方法名规范:前缀 scope,后缀随意,调用时直接把后缀作为参数使用;
    1. public function scopeGenderMale($query)
    2. {
    3. $query->where('gender', '男') ->field('id,username,gender,email')->limit(5);
    4. }
  2. 在控制器端,我们我们直接调用并输出结果即可;
    1. public function queryScope()
    2. {
    3. $result = UserModel::scope('gendermale')->select();
    4. //$result = UserModel::gendermale()->select();
    5. return json($result);
    6. }
  3. 也可以实现多个查询封装方法连缀调用,比如找出邮箱 xiao 并大于 80 分的;
    1. public function scopeEmailLike($query, $value)
    2. {
    3. $query->where('email', 'like', '%'.$value.'%');
    4. }
    5. public function scopePriceGreater($query, $value)
    6. {
    7. $query->where('price', '>', 80);
    8. }
    9. $result = UserModel::emailLike('xiao')->priceGreater(80) ->select();
  4. 查询范围只能使用 find()和 select()两种方法;
    7. 全局范围查询,就是在此模型下不管怎么查询都会加上全局条件;
    1. //全局范围查询
    2. protected function base($query)
    3. {
    4. $query->where('status', 1);
    5. }
  5. 在定义了全局查询后,如果某些不需要全局查询可以使用 useGlobalScope 取消;
    1. UserModel::useGlobalScope(false)
  6. 当然,设置为 true,则开启全局范围查询,注意:这个方法需要跟在::后面;
    1. UserModel::useGlobalScope(true)

    模型输出方式

  7. 通过模版进行数据输出;
    1. public function view()
    2. {
    3. $user = UserModel::get(21);
    4. $this->assign('user', $user);
    5. return $this->fetch();
    6. }
  8. 根据错误提示,可以创建相对应的模版,然后进行数据显示;
    1. {$user.username}.
    2. {$user.gender}.
    3. {$user.email}
  9. 使用 toArray()方法,将对象按照数组的方式输出;
    1. $user = UserModel::get(21);
    2. print_r($user->toArray());
  10. 和之前的数据集一样,它也支持 hidden、append、visible 等方法;
    1. print_r($user->hidden(['password,update_time'])->toArray());
  11. toArray()方法也支持 all()和 select()等列表数据;
    1. print_r(UserModel::select()->toArray());
  12. 使用 toJson()方法将数据对象进行序列化操作,也支持 hidden 等方法;
    1. print_r($user->toJson());