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

  • 14
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
FastAdmin框架开发示例插件的自定义搜索,可以按照以下步骤进行: 1. 创建一个插件,可以参考FastAdmin官方文档的插件开发教程。 2. 在插件的控制器文件(通常是在`/addons/插件名/controller/`目录下),定义一个用于处理搜索的方法。例如,可以在控制器类添加一个名为`search()`的方法。 3. 在`search()`方法,编写你的自定义搜索逻辑。这可以包括从数据查询数据、处理搜索条件、构建搜索结果等。 4. 在插件的视图文件(通常是在`/addons/插件名/view/`目录下),创建一个用于显示搜索结果的模板文件。例如,可以创建一个名为`search.html`的文件。 5. 在模板文件,根据需要添加搜索表单和搜索结果的展示代码。可以使用FastAdmin提供的模板标签和样式类来快速构建搜索界面。 6. 在插件的路由文件(通常是在`/addons/插件名/route.php`文件,为搜索功能定义一个路由规则。例如,可以使用`Route::rule()`方法定义一个GET请求路由规则,将请求路径指向插件的控制器和`search()`方法。 7. 最后,在FastAdmin后台管理界面启用你的插件,并配置相关参数(如果需要)。这样,你的自定义搜索功能就可以在FastAdmin框架使用了。 以上是一个大致的开发流程,你可以根据具体需求进行调整和扩展。请注意,确保你已经熟悉FastAdmin框架的基本开发知识,并按照框架的规范进行插件开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值