fastadmin二次开发中如何自定义查询数据

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,则转发到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,小弟愚笨翻了日志才发现这个问题?

123

当然解决方法也很简单,我这里说一下两种我使用的方法

// 第一种:自定义一个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的使用总结小弟也会在项目一期完工后总结!)

你可能感兴趣的:(PHP)