????????搜索器的作用是用于封装字段(或者搜索标识)的查询条件表达式,一个搜索器对应一个特殊的方法(该方法必须是public类型),方法命名规范为:
searchFieldNameAttr
????????FieldName为数据表字段的驼峰转换,搜索器仅在调用withSearch方法的时候触发。
????????搜索器的场景包括:
????????1.限制和规范表单的搜索条件;
????????2.预定义查询条件简化查询;
? ? ? ? 举个例子,在如下的页面中,如果搜索字段全部为空,则应该显示数据的全部内容(即不进行搜索)。
? ? ? ? 首先,我们先在控制器中添加withSearch方法:
return View::fetch('index',[
'list' => ModelUser::withSearch(['gender', 'username', 'email'], [
'gender' => request()->param('gender'),
'username' => request()->param('username'),
'email' => request()->param('email')
])->paginate(5),
]);
? ? ? ? ?然后,在资源模型中添加对下列字段的校验:
// Gender搜索器
public function searchGenderAttr($query, $value){
return $value ? $query->where('gender', $value) : '';
}
// Username搜索器
public function searchUsernameAttr($query, $value){
return $value ? $query->where('username', 'like', '%'.$value.'%') : '';
}
// Email搜索器
public function searchEmailAttr($query, $value){
return $value ? $query->where('email', 'like', '%'.$value.'%') : '';
}
? ? ? ? ?注意:username字段和email字段需要做模糊匹配。接下来结合分页显示。上面的配置中,只能在默认搜索的第一页正常,第二页就丢失搜索条件,此时,我们需要在分页参数中配置 ?query参数来保存搜索条件:
->paginate([
'list_rows' => 5,
'query' => request()->param()
])
? ? ? ? 其他的细节,在实际的开发中,是交给前端处理的,这里就不再赘述。
? ? ? ? tip:如果打开了tp框架的调试,则在调试对话框中可以查看当前的sql语句。
?
?
|