# 前言

突然发现 fastadmin 的管理员模块,不能根据分组搜索,原来是对应的分组 id, 并不是在管理员表中,
而带有中间表的多对多结构,即管理员对应多个分组,分组对应多个管理员。
以后类似的多对多也可以做参考。

# js 代码

  • 在字段 groups_text 前加上 {field: 'groupIds', title: __('Group'),visible: false},
  • 在普通搜索渲染后,添加关于 selectpage 的代码

修改文件 public/assets/js/backend/auth/admin.js

var table = $("#table");
            // 在普通搜索渲染后
            table.on('post-common-search.bs.table', function (event, table) {
                var form = $("form", table.$commonsearch);
                $("input[name='groupIds']", form).addClass("selectpage").data("source", "auth/group/index").data("primaryKey", "id").data("field", "name").data("orderBy", "id desc");
                Form.events.cxselect(form);
                Form.events.selectpage(form);
            });
            // 初始化表格
            table.bootstrapTable({
                url: $.fn.bootstrapTable.defaults.extend.index_url,
                searchFormVisible: true,
                columns: [
                    [
                        {field: 'state', checkbox: true, },
                        {field: 'id', title: 'ID'},
                        {field: 'username', title: __('Username')},
                        {field: 'nickname', title: __('Nickname')},
                        {field: 'groupIds', title: __('Group'),visible: false},
                        {field: 'groups_text', title: __('Group'), operate:false, formatter: Table.api.formatter.label},
                        {field: 'email', title: __('Email')},
                        {field: 'status', title: __("Status"), searchList: {"normal":__('Normal'),"hidden":__('Hidden')}, formatter: Table.api.formatter.status},
                        {field: 'logintime', title: __('Login time'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass: 'datetimerange', sortable: true},
                    ]
                ]
            });

# php 代码

  • 通过重构 where 搜索,获取的分组 id,再通过分组 id, 获取改分组下的所有管理员 id
  • 再通过 in 搜索条件获取,该分组下的所有管理员

修改文件 application/admin/controller/auth/Admin.php

// 处理 where groupIds begin
            $filter = json_decode($this->request->get("filter", ''), true);
            $op = json_decode($this->request->get("op", '','trim'), true);
            $where0 = [];
            if (isset($filter['groupIds'])) {
                $where0['group_id'] = $filter['groupIds'];
                unset($filter['groupIds'],$op['groupIds']);
            }
            $this->request->get(['filter'=>json_encode($filter,true)]);
            $this->request->get(['op'=>json_encode($op,true)]);
            // 处理 where groupIds end
            list($where, $sort, $order, $offset, $limit) = $this->buildparams();
            //$map 搜索条件
            $map = [];
            if ($where0){
                // 获取某个分组下的全部 id
                $ids = model('AuthGroupAccess')->where($where0)->column('uid');
                $map['id'] = ['in',$ids];
            }
            $list = $this->model
                ->where($map)
                ->where($where)
                ->where('id', 'in', $this->childrenAdminIds)
                ->field(['password', 'salt', 'token'], true)
                ->order($sort, $order)
                ->paginate($limit);