【Table】深入底层,手把手教你关联id的展示,把searchList用到极致 - FastAdmin

前言

这是Table的文档一张图解析FastAdmin中的表格列表的功能,但是没有写到关联id的处理。这么常用的东西K大居然没有想到吗,黑人问号.jpg

相关问题:

关联字段显示id 如何显示name - 2018-06-05

ids关联后,怎么让他显示文字而不是ID - 2019-03-07

多选的分类ID,如何在列表关联显示名称呢? - 2019-06-18

关联字段显示name,不显示id - 2019-09-30

_ids关联的数据如何在列表里的显示改为不是id,而是对应name字段的值 - 2019-07-23

请问如何才能让关联模型分类的ID数字,显示为输入的内容??? - 2020-05-08

关联_id后,下拉列表选择添加后,显示自增ID,不显示选择的信息 - 2020-06-30

得到最多的答案就是关联查询,就这?完全违背了FastAdmin的设计初衷了,完全脱离了极速这两个字

这都0202年了,还没人发现我这种操作吗?

本文以实操的形式,给大家展开叙述。

准备工作

准备数据表

主表

CREATE TABLE `fa_test` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL DEFAULT '' COMMENT '姓名',
  `sex` enum('男','女') NOT NULL DEFAULT '男' COMMENT '性别',
  `work` set('周一','周二','周三','周四','周五','周六','周日') DEFAULT '周一,周二,周三,周四,周五',
  `test_type_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '职业类型',
  `test_group_ids` varchar(255) NOT NULL DEFAULT '' COMMENT '加入的组',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

职业类型表

CREATE TABLE `fa_test_type` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `type` varchar(255) NOT NULL DEFAULT '' COMMENT '职业类型',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

组表

CREATE TABLE `fa_test_group` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL DEFAULT '' COMMENT '组名',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

执行CRUD

php think crud -t test -c test/test
php think crud -t test_type -c test/TestType
php think crud -t test_group -c test/TestGroup

添加菜单

image-20200905152149298.png

插入数据

_7D74539E-9668-4D68-AC2C-F99CFA1A3E61__20200905191110.jpg

开始整活

_id字段

可以看到,默认都是显示ID,搜索也不是selectpage。

职业类型比较简单,更据文档加上searchList: $.getJSON('test/test_type/searchList')

public function searchList()
{
    return $this->model->column('type', 'id');
}
{
  field: 'test_type_id',
  title: __('Test_type_id'),
  searchList: $.getJSON('test/test_type/searchList')
}
20200905191448.jpg

搜索是没问题了,但显示还是ID。下面来改显示问题。根据性别的原理,先加上formatter: Table.api.formatter.normal看看效果。

{
  field: 'test_type_id',
  title: __('Test_type_id'),
  searchList: $.getJSON('test/test_type/searchList'),
  formatter: Table.api.formatter.normal
}
20200905191731.jpg

没有任何效果,那我们来到require-table.js,找到normal

normal: function (value, row, index) {
    var colorArr = ["primary", "success", "danger", "warning", "info", "gray", "red", "yellow", "aqua", "blue", "navy", "teal", "olive", "lime", "fuchsia", "purple", "maroon"];
    var custom = {};
    if (typeof this.custom !== 'undefined') {
        custom = $.extend(custom, this.custom);
    }
    value = value === null ? '' : value.toString();
    var keys = typeof this.searchList === 'object' ? Object.keys(this.searchList) : [];
    var index = keys.indexOf(value);
    var color = value && typeof custom[value] !== 'undefined' ? custom[value] : null;
    var display = index > -1 ? this.searchList[value] : null;
    var icon = typeof this.icon !== 'undefined' ? this.icon : null;
    if (!color) {
        color = index > -1 && typeof colorArr[index] !== 'undefined' ? colorArr[index] : 'primary';
    }
    if (!display) {
        display = __(value.charAt(0).toUpperCase() + value.slice(1));
    }
    var html = '<span class="text-' + color + '">' + (icon ? '<i class="' + icon + '"></i> ' : '') + display + '</span>';
    if (this.operate != false) {
        html = '<a href="javascript:;" class="searchit" data-toggle="tooltip" title="' + __('Click to search %s', display) + '" data-field="' + this.field + '" data-value="' + value + '">' + html + '</a>';
    }
    return html;
}

主要逻辑是这样的,如果有searchList,那么尝试从searchList取值,取不到则使用value

var keys = typeof this.searchList === 'object' ? Object.keys(this.searchList) : [];
var index = keys.indexOf(value);

var display = index > -1 ? this.searchList[value] : null;

if (!display) {
    display = __(value.charAt(0).toUpperCase() + value.slice(1));
}

之前明明已经给了searchList,为什么还是使用了value。那就是searchList的数据有问题呗,那就看看这到底是个什么鬼。

var keys = typeof this.searchList === 'object' ? Object.keys(this.searchList) : [];
console.log('searchList', this.searchList)
console.log('keys', keys)

var display = index > -1 ? this.searchList[value] : null;
console.log('display', display)
20200905193202.jpg

性别是对的,但第二个为什么和预想的不一样呢。这是什么鬼东西?

看了这个,你就恍然大悟了,这不就是ajax对象么。

console.log($.getJSON('test/test_type/searchList'))
20200905193536.jpg

那该怎么处理呢,了解一个东西Promise。写在Controller前面,如果有recyclebin的也是要用的。

20200905195925.jpg
index: async function () {
    // 省略一部分
    table.bootstrapTable({
        columns: [
            {
              field: 'test_type_id',
              title: __('Test_type_id'),
              searchList: await test_type(),
              formatter: Table.api.formatter.normal
            }
        ]
    })
}

index: async functionawait test_type()是关键。这大概就是医学奇迹了吧。

想知道原理请看Promise

20200905200743.jpg

_ids字段

这个我就不解释了哈,太费劲了。原理是一样的。

public function searchList()
{
    return $this->model->column('name', 'id');
}
const test_group = function () {
  return new Promise(resolve => {
    $.getJSON('test/test_group/searchList').done(res => {
      resolve(res)
    })
  })
}

// columns
{
  field: 'test_group_ids',
  title: __('Test_group_ids'),
  searchList: await test_group(),
  formatter: Table.api.formatter.label
}
20200905201451.jpg

结语

既然用了searchList,这一次请求是逃不掉的,那就让他作用到极致。老板的微笑.jpg

同样都是三次查询,index使用关联查询的话,系统开销就变大了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,322评论 5 465
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,288评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,227评论 0 327
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,015评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,936评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,534评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,995评论 3 389
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,616评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,907评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,923评论 2 315
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,741评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,525评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,016评论 3 301
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,141评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,453评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,054评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,249评论 2 339