ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
>[danger] 搜索器简介 [TP6.0 搜索器 官方文档](https://www.kancloud.cn/manual/thinkphp6_0/1037590) 用于封装字段的查询表达式,一个搜索器对应一个特殊的方法(该方法必须是public类型) >[danger] 搜索器应用场景 - 限制和规范表单的搜索条件 - 预定义查询条件简化查询 ``` 其实就是用于封装查询条件表达式,最常见的是用于搜索数据、根据某个字段查询数据 ``` >[danger] 模型搜索器定义规范 + 访问类型:public + 方法名:searchFieldNameAttr + `FieldName`是数据表字段名的大驼峰命名转换 >[danger] 框架源码 ~~~php /** * 使用搜索器条件搜索字段 * @access public * @param array $fields 搜索字段 * @param array $data 搜索数据 * @param string $prefix 字段前缀标识 * @return $this */ public function withSearch(array $fields, array $data = [], string $prefix = '') { foreach ($fields as $key => $field) { if ($field instanceof Closure) { $field($this, $data[$key] ?? null, $data, $prefix); } elseif ($this->model) { // 检测搜索器 $fieldName = is_numeric($key) ? $field : $key; $method = 'search' . Str::studly($fieldName) . 'Attr'; if (method_exists($this->model, $method)) { $this->model->$method($this, $data[$field] ?? null, $data, $prefix); } } } return $this; } ~~~ >[danger] 搜索器方法的参数 + $query:是一个对象,用于链接操作,不需要管他是什么值 + $value : 当前搜索器方法对应的字段值 + $data : withSearch()方法第二个参数的值 ``` // create_time 字段搜索器 时间范围查询 public function searchCreateTimeAttr($query, $value, $data) { // $query // $query是一个对象,用于实现链式操作 // // $value // 假设withSearch的第二参数为$arr // 则 $value = $arr['create_time'] // // $data // withSearch()方法第二个参数的值 $query->whereBetweenTime('create_time', $value[0], $value[1]); } ```