问题背景
:最近做一个网站的过程中遇到了一个需求:对于不同用户组的用户,显示的数据要根据权限来筛选。问题看起来不是很难,文档和社区中已经给了足够的提示,我想对于自己遇到的问题进行如下总结。
首先打开我想要操作的控制器 \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,则转发到Selectpage
if ($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的使用总结小弟也会在项目一期完工后总结!)