# 前言
突然发现 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); |