zoukankan      html  css  js  c++  java
  • 模型搜索器和数据集

    一.模型搜索器

    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);
        }
  • 相关阅读:
    阿里云 k8s 部署 Spring Cloud Alibaba 微服务实践 (四) 自动化部署
    阿里云 k8s 部署 Spring Cloud Alibaba 微服务实践 (三) 服务观测
    阿里云 k8s 部署 Spring Cloud Alibaba 微服务实践 (二) 部署微服务程序
    阿里云 k8s 部署 Spring Cloud Alibaba 微服务实践 (一) 部署 Nacos
    C++知识点
    libmkl 学习笔记
    基于tesseract-OCR进行中文识别
    poco编译与运行
    Linux下的I/O复用与epoll详解(转载)
    高并发网络编程之epoll详解(转载)
  • 原文地址:https://www.cnblogs.com/xiaowie/p/15696928.html
Copyright © 2011-2022 走看看