fastadmin二次开发中如何自定义查询数据
问题背景
:最近做一个网站的过程中遇到了一个需求:对于不同用户组的用户,显示的数据要根据权限来筛选。问题看起来不是很难,文档和社区中已经给了足够的提示,我想对于自己遇到的问题进行如下总结。
首先打开我想要操作的控制器 \admin\controller\Tapply.php
可以看到如下注释
/*** 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法* 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑* 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改*/
所以如果我们想重新定义查询条件的话,应该先把目录\admin\library\traits\Backend.php
中的index方法复制过来
/*** 查看*/
public function index()
{//设置过滤方法$this->request->filter(['strip_tags']);if ($this->request->isAjax()) {//如果发送的来源是Selectpage,则转发到Selectpageif ($this->request->request('keyField')) {return $this->selectpage();}list($where, $sort, $order, $offset, $limit) = $this->buildparams();$total = $this->model->where($where)->order($sort, $order)->count();$list = $this->model->where($where)->order($sort, $order)->limit($offset, $limit)->select();$list = collection($list)->toArray();$result = array("total" => $total, "rows" => $list);return json($result);}return $this->view->fetch();
}
如果不去抠细节,我们可以看到$total
和$list
分别是用ThinkPHP5
中最基本的方法来获取数据集和它的总数,最后返回的是json
数据,接下来的操作应该是把接口给前端再进行显示就可以了。
那么如果想筛选直接使用$where["column_name"] = "column_value"
就可以了嘛?
答案是不太行
我们来看一看list($where, $sort, $order, $offset, $limit) = $this->buildparams();
这一句代码
找到这个函数,函数有些长,我这里只复制一部分与where有关的
/*** 生成查询所需要的条件,排序方式* @param mixed $searchfields 快速查询的字段* @param boolean $relationSearch 是否关联查询* @return array*/
protected function buildparams($searchfields = null, $relationSearch = null)
{... $where = [];...$where[] = [$k,"LIKE","%".$v."%"];...//说出来不怕各位大佬笑话,这个闭包真的是小弟第一次见到,都怪自己读代码读得少$where = function ($query) use ($where) {foreach ($where as $k => $v) {if (is_array($v)) {call_user_func_array([$query, 'where'], $v);} else {$query->where($v);}}};return [$where, $sort, $order, $offset, $limit];
}
所以,最后的$where
并不是一个数组,而是一个闭包Closure
,小弟愚笨翻了日志才发现这个问题?
当然解决方法也很简单,我这里说一下两种我使用的方法
// 第一种:自定义一个where查询数组,然后在查询是多加一个where条件,不过如果遇到多表级联查询,需要注意相同的字段要指定表明,否则会引起冲突(歧义)
$mywhere = [];
/*根据权限产生不同的where条件*/
$con = "";
if($con){$mywhere["tapply.id"] = 1;
}
$total = $this->model->with(['profess','student','teacher'])->where($where)->where($mywhere)->order($sort, $order)->count();$list = $this->model->with(['profess','student','teacher'])->where($where)->where($mywhere)->order($sort, $order)->limit($offset, $limit)->select();-------------------------------------------------------------------------------------
//第二种:把传回来的where强制转型为array,然后就可以按原来的方法查询了
$where = (array)$where;
$where["tapply.id"]=1;//个人更偏向第一种方法,尽量不要对框架封装好的代码进行修改。
[结语] 个人水平有限,仍在努力学习。大家有方法可以一起交流?(fastadmin的使用总结小弟也会在项目一期完工后总结!)