Rumah > Artikel > rangka kerja php > ThinkPHP6搜索器的使用
在ThinkPHP5.1.22中新增模型搜索器功能。搜索器的作用是用于封装字段(或者搜索标识)的查询条件表达式,一个搜索器对应一个特殊的方法(该方法必须是public类型),方法命名规范为:searchFieldNameAttr。
搜索器的场景包括:
限制和规范表单的搜索条件;
预定义查询条件简化查询;
搜索器的比较:
搜索器通常会和查询范围进行比较,搜索器无论定义了多少,只需要一次调用,查询范围如果需要组合查询的时候就需要多次调用。
Admin模型中定义的 getByData()方法 用于查询数据并以JSON格式返回,因为我们前端使用的是LayUI的数据表格。searchUsernameAttr()、searchCreateTimeAttr()这两个方法正是搜索器 命名规范为:searchFieldNameAttr,FieldName为数据表字段的驼峰转换,搜索器仅在调用withSearch方法的时候触发。搜索器方法的参数有三个,第一个是查询对象,第二个是当前搜索标识的值,第三个是当前所有的搜索数据(可选)。
<?php namespace app\model; use think\Exception; use think\Model; class Admin extends Model { //查询数据(数据表格) public static function getByData($limit='10',$order='id desc',$field='*',$search=[],$searchKey=[]) { try { //查询数据 $result = self::withSearch($searchKey,$search)->order($order)->field($field)->paginate(request()->get('limit',$limit))->toArray(); }catch (\Exception $e){ throw new Exception('数据库内部错误!'); } //返回格式为json的数据 return json([ 'code' => 0, 'msg' => '数据请求成功', 'count' => $result['total'], 'data' => $result['data'] ]); } /** * @desc 查询用户名 * @param $query 查询对象 * @param $value 搜索的值 * @param $data 搜索数据(可忽略) */ public function searchUsernameAttr($query, $value, $data) { $query->where('username','like', '%' . $value . '%'); } /** * @desc 添加时间范围查询 * @param $query * @param $value */ public function searchCreateTimeAttr($query, $value) { $query->whereBetweenTime('create_time', $value[0], $value[1]); } }
<?php namespace app\controller; use app\BaseController; use app\model\Admin as AdminModel; class Admin extends BaseController { //渲染页面 public function index() { return view(); } //数据表格接口 public function data() { //存放搜索条件 $search = []; //接收前台查询传递过来的参数 $username = request()->param('username','','trim'); $create_time = request()->param('create_time','','trim'); //如果参数不为空,把数据赋值给$search if (!empty($username)){ $search['username'] = $username; } if (!empty($create_time)){ $search['create_time'] = explode('~',$create_time); } //获取$search[] 中的key $searchKey = []; if (!empty($search)){ $searchKey = array_keys($search); } return AdminModel::getByData(10,'id desc','*',$search,$searchKey); } }
3.1、在项目目录下执行以下命令:
composer require topthink/think-view
3.2、在app\view\admin文件夹下创建index.html文件
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>搜索器</title> <meta name="renderer" content="webkit"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0"> <link rel="stylesheet" href="https://heerey525.github.io/layui-v2.4.3/layui-v2.4.4/css/layui.css" media="all"> <script src="https://heerey525.github.io/layui-v2.4.3/layui-v2.4.4/layui.js" charset="utf-8"></script> <script src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script> </head> <body> <div class="layui-fluid"> <div class="layui-row layui-col-space15"> <div class="layui-col-md12"> <div class="layui-card"> <!-- 搜索框 --> <div class="layui-card-body" style="padding-bottom: 0;"> <div class="layui-form"> <div class="layui-inline layui-show-xs-block"> <input type="text" id="username" name="username" placeholder="请输入用户名" autocomplete="off" class="layui-input"> </div> <div class="layui-inline layui-show-xs-block"> <input type="text" id="test1" name="create_time" placeholder="请选择时间范围" autocomplete="off" class="layui-input"> </div> <div class="layui-inline layui-show-xs-block"> <button class="layui-btn" id="search"><i class="layui-icon"></i></button> </div> </div> </div> <div class="layui-card-body "> <!--数据表格--> <table id="dataTable" lay-filter="dataTable"></table> </div> </div> </div> </div> </div> </body> <script> layui.use(['layer','table','form','laydate'],function () { var layer = layui.layer,form = layui.form,table = layui.table, laydate = layui.laydate; //日期时间范围 搜索 laydate.render({ elem: '#test1' , type: 'datetime' , range: '~' }); //用户表格初始化 var dataTable = table.render({ elem: '#dataTable' ,url: "/admin/data" //数据接口 ,page: true //开启分页 ,toolbar: "#toolbarTpl" ,cols: [[ //表头 {checkbox: true,fixed: 'left'} ,{field: 'id', title: 'ID', sort: true,width:70} ,{field: 'username', title: '用户名'} ,{field: 'create_time', title: '添加时间',width:160} ]] }); //搜索 $("#search").click(function () { var username = $("#username").val(); var create_time = $("#test1").val(); dataTable.reload({ where:{username:username,create_time:create_time}, page:{curr:1} }); }); }); </script> </html>
Atas ialah kandungan terperinci ThinkPHP6搜索器的使用. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!