记录:
文档定义:搜索器的作用是用于封装字段(或者搜索标识)的查询条件表达式,一个搜索器对应一个特殊的方法(该方法必须是public
类型)。
方法命名规范为:searchFieldNameAttr:
- FieldName为数据表字段的驼峰转换。
- 搜索器仅在调用
withSearch
方法的时候触发。 - 若传入的查询字段未定义对应的搜索器,则自动过滤掉此字段的查询。
- 搜索器通常会和查询范围进行比较,搜索器无论定义了多少,只需要一次调用,查询范围如果需要组合查询的时候就需要多次调用。
示例:
1,模型中定义搜索器,username字段和create_time字段
<?php
namespace app\common\model;
use think\Model;
class User extends Model
{
//搜索器,username字段
public function searchUsernameAttr($query,$value,$data){
$query->where('username','like',$value.'%');
//可对传入的sort字段进行排序
if(isset($data['sort'])){
$query->order($data['sort']);
}
}
//搜索器,create_time字段
public function searchCreateTimeAttr($query,$value,$data){
$query->whereBetweenTime('create_time',$value[0],$value[1]);
}
}
2,控制器中调用:
public function search(){
$result = model('user')->withSearch(['username','create_time'], [
'username' => 'think',
'create_time' => ['2017-1-1','2019-8-5'],
'status' => 1, //未定义status对应的获取器,查询时会自动去掉此参数
'sort' => ['create_time'=>'desc'],
])
->select()->toArray();
echo '<pre>';print_r($result);
echo '<pre>';print_r(model('user')->getLastSql());
}
查询的SQL语句:
SELECT * FROM `tp_user` WHERE `username` LIKE '%' AND `create_time` BETWEEN 1483200000 AND 1564934400 ORDER BY `create_time` DESC