模型搜索器和数据集

一.模型搜索器

1. 搜索器是用于封装字段(或搜索标识)的查询表达式;

2. 一个搜索器对应模型的一个特殊方法,该方法为 public;

3. 方法名的命名规范为:searchFieldNameAttr();

4. 举个例子,我们要封装一个邮箱字符模糊查询,然后封装一个时间限定查询;

5.FieldName为数据表字段的驼峰转换,搜索器仅在调用withSearch方法的时候触发;

 在 User 模型端,我创建两个对外的方法,如下:

    // 定义搜索器
    public function searchBnameAttr($query,$value){
        //创建搜索规则
        $query->where('bname','like',$value.'%');
    }

在控制端使用withSearch()

    public function show(){
        // 使用搜索器过滤显示,withSearch两个参数必须为数组
        $user=UserModel::withSearch(['bname'],['bname'=>'王'])->select();
        return json($user);
    }

如果搜索器需要过滤两个字段bname u_time,那需要在模型中创建两个搜索器 searchBname()  searchU_time(),

控制器在调用withSearch(['bname','u_time'],['bname=>'du','u_time'=>['2021-10','2021-11']]);

6.如果你想在搜索器添加一个可以排序的功能,具体如下:

public function searchEmailAttr($query, $value, $data)
{
$query->where('email', 'like', $value.'%');
if (isset($data['sort'])) {
$query->order($data['sort']);
}
}

7.搜索器的第三个参数$data,可以得到 withSearch()方法第二参数的值;

8. 字段也可以设置别名:'create_time'=>'ctime'

二.模型数据集

1. 数据集由 all()和 select()方法返回数据集对象;

2. 数据集对象和数组操作方法一样,循环遍历、删除元素等;

3. 判断数据集是否为空,我们需要采用 isEmpty()方法;

  public function show(){
        // 使用搜索器过滤显示,withSearch两个参数必须为数组
        $user=UserModel::select(['bid'=>88]);
        if($user->isEmpty()){
            return "数据不存在!";
        }
    }

4.使用模型方法 hidden()可以隐藏某个字段,使用 visible()显示只某个字段;

    public function show(){
        // 使用搜索器过滤显示,withSearch两个参数必须为数组
        $user=UserModel::select();
        //获取数据集后,隐藏bid字段
       return $user->hidden(['bid']);
    }
    public function show(){
        // 使用搜索器过滤显示,withSearch两个参数必须为数组
        $user=UserModel::select();
        //获取数据集后,只显示bid字段
       return $user->visible(['bid']);
    }

5. 使用 append()可以添加某个获取器字段,使用 withAttr()对字段进行函数处理;

比如我们在模型中定义了一个获取器No,可以显示在别的地方

$result = UserModel::select(); $result->hidden(['password'])->append(['nothing'])
    public function show(){
        // 使用搜索器过滤显示,withSearch两个参数必须为数组
        $user=UserModel::select();
        //获取数据集后,使用withAttr()bname 字段进行函数处理
       return $user->withAttr('bname',function ($value){
            return strtoupper($value);
       });
    }

6. 使用模型方法 filter()对筛选的数据进行过滤;

 public function show(){
        // 使用搜索器过滤显示,withSearch两个参数必须为数组
        $user=UserModel::select();
        //获取数据集后,使用filter过滤器过滤想要的参数
        $result=$user->filter(function  ($data){
            return $data['bid'] > 10;
        });

       return json($result);
    }

7.也可以使用数据集之后链接 where()方法来代替 filter()方法;

    public function show(){
        // 使用搜索器过滤显示,withSearch两个参数必须为数组
        $user=UserModel::select();
        //获取数据集后,使用where 代替filter
        $result=$user->where('bid','>','10');

       return json($result);
    }

8.数据集甚至还可以使用 order()方法进行排序;

$result = UserModel::select()->order('price', 'desc');

二、数据集

模型的allselect查询方法返回数据集对象 think\model\Collection,该对象继承自think\Collection,因此具有数据库数据集的所有方法,而且还提供了额外的模型操作方法。

    public function show(){
      $user=new UserModel();
      //模型的all和select方法返回额外的数据集
      // 如果 $user->find()  count()方法不可用
      $result=$user->select();
      //循环输出
      foreach($result as $list){
        dump($list);
      }
      unset($list[0]);  //销毁某个元素
    }

需要注意的是,如果要判断数据集是否为空,不能直接使用empty判断,而必须使用数据集对象的isEmpty方法判断,例如:

    public function show(){
      $user=new UserModel();
      $result=$user->select();
      //判断数据集是否为空,不能使用empty() 必须要使用模型下的isEmpty()
      if($result->isEmpty()){
        echo '数据集为空';
      }else{
        echo '数据集不为空';
      }
    }

你可以使用模型的hidden/visible/append/withAttr方法进行数据集的输出处理,例如:

    public function show(){
      $user=new UserModel();
      $result=$user->select();
      //隐藏bname字段不显示
      $result=$result->hidden(['bname']);
      return json($result);
      
    }
    public function show(){
      $user=new UserModel();
      $result=$user->select();
      //只显示bname字段不显示
      $result=$result->visible(['bname']);
      return json($result);
      
    }
    public function show(){
      $user=new UserModel();
      $result=$user->select();
      //通过使用获取器不需要在模型中定义,转换bname字段为大写
      $result=$result->withAttr('bname',function ($value){
        return strtoupper($value);
      });
      return json($result);
      
    }

如果需要对数据集的结果进行筛选,可以通过filter方法进行数据过滤,例如:

    public function show(){
      $user=new UserModel();
      $result=$user->select();
      //需要对结果集进行过滤输出使用filter();
      $result=$result->filter(function ($data){
          return $data['u_time'] >'2021-12-01';
      });

      
      return json($result);
      
    }

V5.1.23+版本开始,支持数据集的order排序操作。

    public function show(){
      $user=new UserModel();
      $result=$user->select()->hidden(['bname'])->filter(function ($data){
        return $data['u_time'] > '2021-12-01';
      })->order('bid','desc');
      
      return json($result);
    }
原文地址:https://www.cnblogs.com/xiaowie/p/15696928.html