「FastAdmin」fastadmin二次开发中如何自定义查询数据 您所在的位置:网站首页 fastadmincms修改 「FastAdmin」fastadmin二次开发中如何自定义查询数据

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

2024-05-28 07:15| 来源: 网络整理| 查看: 265

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的使用总结小弟也会在项目一期完工后总结!)



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有