一、简介
扩展表是将多层存在一对多关系的数据表按关联数据字段与主键左连接而成的全新数据模型。
这种模型的核心思想是将一个表中的记录插入到另一个表中,并且目标表数据发生变化后,源表已连接的相关字段也会自动更新。扩展表可以帮助开发人员更轻松地管理数据,提高数据库的效率。
二、交互流程
创建扩展表模型时先选择基准表,作为连接主体。
在进入模型配置区后即可开始添加需要连接的目标模型,确认匹配字段及匹配规则。
完成扩展连接后即可预览连接结果,基于结果可调整字段显隐、顺序及别名,也可添加额外的公式字段。
三、模型配置项
在扩展表配置区中最重要的就是构建扩展表连接关系,这里可以看作是将多张数据表进行横向连接(左连接),但会有所限制。
(一)连接配置
基于当前扩展表,通过“添加数据表”连接目标数据表。建立匹配关系后,目标数据表的字段支持两种取值方式:
- 取字段值(Beta测试中),取匹配到的第一条目标表数据原始值。
- 统计,取匹配到的所有目标表数据统计值,即将多条数据的值进行统计计算。(不同类型的字段支持不同的统计方式)
1.取字段值
若在添加数据表时,选择“取字段值”的取值方式,相应的拼接字段会以数据记录行原值的形式展示;
且基于匹配条件将两个数据表进行关联后,若匹配结果同时有多条数据,按排序规则取第一条数据,即当前扩展表每条数据只会匹配目标数据表中选取的一条数据,一一对应。
2.统计
若在添加数据表时,选择“统计”的取值方式,则相应的拼接字段会将所有匹配的数据记录行分组,在组内进行计数等统计后展示;
不同的数据类型提供不同的统计方式选择,可参见《数据类型简介》说明。
(二)数据筛选
对于基准表和准备连接的目标数据表数据,我们都可以通过设置筛选条件《筛选条件》,来过滤保留所需要的数据记录行。
基准表在如上入口设置,添加数据表时,则可在弹窗页面对目标表进行相应的数据筛选。
筛选条件支持单一条件和组条件的形式,搭配多种不等式/等式/范围等判断,检索相应符合条件的数据。
(三)字段配置
在连接配置的树结构中,展示了基准表与目标数据表的字段列表,可以通过勾选控制每个字段的显示/隐藏。
高级字段说明:
若基准表或目标数据表中带有关联数据或子表字段,不具备在数据表中关联展示的特性。
- 关联数据,关联数据字段在扩展表中仅作为记录关联模型的主键值,不能直接展示数据标题或关联数据下的其他字段;
- 子表,子表字段在扩展表中不能展示。若需要展示子表中的字段,可以通过连接目标数据表的关联数据字段和当前扩展表的主键进行配置关联。
四、数据配置
在数据配置中能预览扩展表连接结果,并支持调整字段列顺序/别名,或者新增额外的公式字段。
数据预览最多展示前50行数据,仅供参考。
(一)添加公式字段
若需要基于现有扩展表增加公式值,可以添加公式字段,利用《计算公式》模块。该字段能结合已有字段进行一系列逻辑计算后输出相应统计结果。
当前已支持基本数值运算规则及数值、日期、文本常用取值方法,同时也允许通过复杂程序语法来进行部分逻辑运算。
(二)修改字段
在修改字段中,展示所有拼接后的扩展表字段列表,可以通过拖拽改变字段的排列顺序,或者修改字段标题(表头以最新的字段标题展示)。
五、模型函数
在扩展表中的所有函数均不支持事件订阅,但其所连接的基准表/目标数据表本身触发的数据变化可正常触发模型事件。
(一)类函数
函数title | 函数name | 参数 | 返回值类型 | 备注 |
---|---|---|---|---|
获取一条数据 | get | 筛选条件:筛选条件 | 单行数据 | 返回符合条件的第一条数据 |
查询多行数据 | query | 筛选条件:筛选条件, 字段列表:【x,y】 排序:未知类型, 当前页:数字, 分页大小:数字, | 字典,示例如下: { rowDatas:【】, totalCount:xxx, } | |
新增数据 | create | 新增数据:单行数据 | 单行数据 | |
批量新增或更新 | createOrUpdateMany | 新增数据:多行数据 | 列表 | 若多行数据中的数据主键为空,则执行新增操作;若多行数据的主键不为空,则执行更新操作 |
按筛选条件更新数据 | updateByFilter | 筛选条件:筛选条件, 更新值:单行数据. a=3,a+=3,清空 | ||
按主键更新数据 | updateByPK | 列表 | 多行数据 | |
按筛选条件删除数据 | deleteByFilter | 筛选条件:筛选条件 | ||
按主键删除数据 | deleteByPK | 主键列表:特殊类型 | 多行数据 |
(二)成员函数
函数 title | 函数 name | 参数 | 返回值 | 说明 |
---|---|---|---|---|
刷新 | refresh | 无 | 无 | 从数据库中获取最新数据 |
保存 | save | 无 | 无 | 将数据保存到数据库中 |
删除 | delete | 无 | 无 |
因为扩展表模型是继承模型基类的,所以也可以直接使用模型基类中的成员函数。
函数 title | 函数 name | 参数 | 返回值 | 备注 |
---|---|---|---|---|
重置 | reset | 无 | 无 | 清空所有字段值,但会保留默认值 |
六、函数设计
在模型构建模块中,我们统一提供了函数设计组件,以供对模型本身进行操作方法层面的扩展。
七、代码实现
在扩展表的代码区中包含了两个文件,分别是e.json和model.py。
e.json是对扩展表元素的声明,包含了类型、存储路径、基准表、名称等信息。
{
"type": "models.ExtendType",
"path": "models",
"title": "订单扩展",
"baseModel": "models.OrderModel",
"db": "databases.Default",
"backendBundleEntry": ".",
"fromDb": 0
}
model.py则主要包括扩展表的字段信息、连接配置信息(主要以T表达式构建连接关系)和扩展表新建的成员函数信息。配置区与代码区保持同步,在配置区的操作会自动同步更新代码区,在代码区的操作也会自动同步更新配置区。
from models.ExtendType import ExtendModel
from datatypes.Meta import datatypes
class orderExtension(ExtendModel):
T0_drillNo1 = datatypes.Serial(name = "T0_drillNo1" , title = "流水号" , isExtend = False , description = "" , placeholder = "" , dbIndex = True , unique = True , default = None , primaryKey = True , prefix = "DD" , connector = "" , dateTimeFormat = "YYYYMMDD" , incNum = 2 , startNumber = 1 , fieldId = "" , readOnly = 1)
T0_customer = datatypes.RelateData(name = "T0_customer" , title = "客户" , isExtend = False , description = "" , placeholder = "" , dbIndex = True , unique = 0 , default = None , relateField = "id" , relateType = "mto" , generic = "models.CustomerModel" , relateFieldType = "AutoInt" , relateFieldTitle = "")
T0_salesman = datatypes.Member(name = "T0_salesman" , title = "业务人员" , isExtend = False , description = "" , placeholder = "" , dbIndex = True , unique = 0 , default = None , selectionWay = "custom" , availableUser = {} , allowLeave = 0 , mulLevelSelectionConfig = [])
T0_total_price = datatypes.Money(name = "T0_total_price" , title = "订单总价(元)" , isExtend = False , description = "" , placeholder = "" , dbIndex = True , unique = 0 , default = None , maxDigits = 18 , decimal = 2 , unit = "元")
T0_operationalComponent = datatypes.Dept(name = "T0_operationalComponent" , title = "业务部门" , isExtend = False , description = "" , placeholder = "" , dbIndex = True , unique = 0 , default = None , selectionWay = "custom" , availableDeptId = None , mulLevelSelectionConfig = None , availableParentDeptId = None)
T0_remarks = datatypes.Ltext(name = "T0_remarks" , title = "备注" , isExtend = False , description = "" , placeholder = "" , dbIndex = False , unique = 0 , default = None , limit = False , maxLen = 1024 , minLen = 0)
T0_contract_annexs = datatypes.File(name = "T0_contract_annexs" , title = "合同附件" , isExtend = False , description = "" , placeholder = "" , dbIndex = None , unique = 0 , default = None , maxCount = 5 , maxSize = 20 , selectedDown = False , selectedDelete = False , selectedDownUser = None , selectedDeleteUser = None)
T0_date = datatypes.Date(name = "T0_date" , title = "签订日期" , isExtend = False , description = "" , placeholder = "" , dbIndex = True , unique = 0 , default = None , dateTimeType = "DAY" , dateTimeFormat = "YYYY-MM-DD" , createDefault = False , updateDefault = False , autoAssign = None)
T0_f353 = datatypes.Datetime(name = "T0_f353" , title = "到期时间" , isExtend = False , description = "" , placeholder = "" , dbIndex = True , unique = 0 , default = None , dateTimeType = "SECOND" , dateTimeFormat = "YYYY-MM-DD HH:mm:ss" , createDefault = False , updateDefault = False , autoAssign = None)
T1_order = datatypes.RelateData(name = "T1_order" , title = "关联订单" , isExtend = False , description = "" , placeholder = "" , dbIndex = True , unique = 0 , default = None , relateField = "drillNo1" , relateType = "mto" , generic = "models.OrderModel" , relateFieldType = "Serial" , relateFieldTitle = "" , readOnly = 1)
class Meta:
modelType = "ExtendType"
db = "databases.Default"
dataTitle = None
dbTable = "Select([F(\"T0.drillNo1\", \"T0_drillNo1\"), F(\"T0.customer\", \"T0_customer\"), F(\"T0.salesman\", \"T0_salesman\"), F(\"T0.total_price\", \"T0_total_price\", \"订单总价(元)\"), F(\"T0.operationalComponent\", \"T0_operationalComponent\"), F(\"T0.remarks\", \"T0_remarks\"), F(\"T0.contract_annexs\", \"T0_contract_annexs\"), F(\"T0.date\", \"T0_date\"), F(\"T0.f353\", \"T0_f353\"), F(\"T1.order\", \"T1_order\")], From([Select([F(\"drillNo1\"), F(\"customer\"), F(\"salesman\"), F(\"operationalComponent\"), F(\"total_price\"), F(\"remarks\"), F(\"contract_annexs\"), F(\"date\"), F(\"f353\")], From([\"models.OrderModel\"])), \"T0\"], LeftJoin(Select([F(\"order\")], From([\"models.SubOrderModel\"]), GroupBy(F(\"order\"))),\"T1\"), On([F(\"T1.order\"), \"=\", F(\"T0.drillNo1\")])))"
name = "orderExtension"
baseModel = "models.OrderModel"
unionIndexList = []
unionUniqueList = []
八、使用效果
扩展表的使用与聚合表类似,除了正常在函数设计中调用模型函数以外,也可以在页面组件中作为数据源配置。
九、使用场景示例
在实际的业务场景中,如客户》线索》商机》报价》订单》合同》退款,每个数据表层层关联时,就可以通过扩展表将以上多表连接,并抽取出最终需要展示的字段。如此在页面展示上便可呈现出:
- 通过表单查看退款详情时,同时可以查看合同/订单/客户详情信息;
- 编辑退款详情时,同时可以编辑合同/订单/客户等信息;
- 新增退款记录时,可以完善新增合同/订单/客户等信息。
十、注意事项
扩展表区别于聚合表,对于两表连接有一对一的限制,因此不会改变基准表记录行数量。
在使用扩展表模型时需要注意性能问题。
请访问极态云官网
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。