Bootstrap

UNIAPP&schema2code生成的列表页面中的搜索功能

在uniapp中用schema2code可以快速生成增/删/改查页面.

如果只是简单表,非常好用,

但是如果你的数据表有外键关联,

有些地方文档里没有讲到好像.

1.感觉像是个BUG

当有外键时,特别是有多个关键关联多个表时,

如果生成的列表页不正常(控制台报错,白屏)

你可以在代码中找找下面这一行,

collectionList: [db.collection('xxxx1')].getTemp(),db.collection('xxxx2')].getTemp().......]

这里有多个getTemp()生成临时表,

检查下是不是有重复的,删除即可恢复list页面的正常工作.

 2.如下图列表页中的搜索框,

    默认是不工作的.

它其实是需要配置的,

在列表页的代码中找到script标签, 下面一点就能看到官方备注

<script>
  import { enumConverter, filterToWhere } from '../../js_sdk/validator/sj-product-yl.js';

  const db = uniCloud.database()
  // 表查询配置
  const dbOrderBy = '' // 排序字段
  const dbSearchFields = ["product_id[0].text"] // 模糊搜索字段,支持模糊搜索的字段列表。联表查询格式: 主表字段名.副表字段名,例如用户表关联角色表 role.role_name
  // 分页配置
  const pageSize = 20
  const pageCurrent = 1

需要说的是,如果需要搜索的字段是从副表拿来的,

订单表order里有个userId, 他和user表的_id外键关联, 但是我们搜索的不是userID,而是user表里的username,

那这里的要填的搜索字段就应该是

const dbSearchFields=['userId[0].userName']

易错的地方来了,

这两个表,order和user为了用schema2code生成的页面中, 

在schema中写法如下(官方写法)

//在order表的schema.json中
.....
"user_id":{
			"bsonType": "string",
			"description": "用户ID",
			"title": "用户ID",
			"foreignKey": "user._id",
			"enum":{
				"collection": "user",
				"field": "_id as value,username as text"
			}
		},

最后一行,它把要从联表查询副表中需要显示的数据命名成了text,

这样是为了使在生成的页面中,可以为uni-data-picker(内部数据格式应该也是value 和text) 填充数据.如图

问题就在这里,如果你想使用搜索功能,

这时在前面配置的搜索字段就因为这个原因不工作了.我们要搜索的是副表的username,

但是username as text, 它改名了,不叫username了,所以 不工作了......

const dbSearchFields=['userId[0].userName']

改为

const dbSearchFields=['userId[0].text']

文档里没有说到~~~弄我一天. ...

;