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);
        }
  • 相关阅读:
    Linux基础文件打包
    Linux基础文件查找
    Apache的三种工作模式及相关配置
    elasticsearch启动错误整理
    Zabbix-agentd错误整理
    Nginx编译安装
    PHP编译安装
    Zabbix编译安装(全)
    Chetsheet: 2017 01.01 ~ 01.31
    Cheatsheet: 2016 12.01 ~ 12.31
  • 原文地址:https://www.cnblogs.com/xiaowie/p/15696928.html
Copyright © 2011-2022 走看看