模型搜索器和数据集
一.模型搜索器
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');
二、数据集
模型的all
和select
查询方法返回数据集对象 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); }