本文主要是介绍筋斗云接口编程 / 虚拟字段(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
计算字段
在定义虚拟字段时,”res”也可以是一个计算值,或一个很复杂的子查询。
例如表OrderItem是Ordr对象的一个子表,表示订单中每一项产品的名称、数量、价格:
@Ordr: id, userId, status(2), amount, dscr(l)
@OrderItem: id, orderId, name, qty, price一个订单对应多个产品项:
OrderItem(orderId) n<->1 Ordr
在添加订单时,同时将每个产品的数量、单价添加到OrderItem表中了。
订单中有一个amount字段表示金额,由于可能存在折扣或优惠,它不一定等于OrderItem中每个产品价格之和。
现在希望增加一个amount2字段,它表示原价,根据OrderItem中每个产品价格累加得到,接口设计如下:
Ordr.query() -> tbl(..., amount2)返回
- amount2: 订单原价。
仍然用vcolDefs定义一个虚拟字段,可以直接用一个SQL查询得到amount2字段:
class AC1_Ordr extends AccessControl
{protected $vcolDefs = [["res" => ["(SELECT SUM(qty*ifnull(price2,0)) FROM OrderItem WHERE orderId=t0.id) AS amount2"],]];
}
这里amount2在res中定义为一个复杂的子查询,其中还用到了t0表,也即是主表”Ordr”的固定别名。
可想而知,在这个例子中,取该字段的查询效率是比较差的。也不要把它用到cond条件中。
[子表字段]
上面Ordr与OrderItem表是典型的一对多关系,有时希望在返回一个对象时,同时返回一个子对象数组,比如获取一个订单像这样:
{ id: 1, dscr: "换轮胎及洗车", ..., orderItem: [{id: 1, name: "洗车", price: 25, qty: 1}{id: 2, name: "换轮胎", price: 380, qty: 2}
]}
后面章节”子表对象”将介绍其实现方式。但如果子对象相对简单,且预计记录数不会特别多,
我们也可以把子表压缩成一个字符串字段,表中每行以”,”分隔,行中每个字段以”:”分隔,像这样返回:
{ id: 1, dscr: "换轮胎及洗车", ..., itemsInfo: "洗车:25:1,换轮胎:380:2"}
设计接口原型如下,我们用List来描述这种紧凑列表的格式:
Ordr.query() -> tbl(..., itemsInfo)返回
- itemsInfo: List(name, price, qty). 格式例如"洗车:25:1,换轮胎:380:2", 表示两行记录,每行3个字段。注意字段内容中不可出现":", ","这些分隔符。
子表字段也是一种计算字段,可实现如下:
class AC1_Ordr extends AccessControl
{protected $vcolDefs = [["res" => ["(SELECT group_concat(concat(oi.name, ':', oi.price, ':', oi.qty)) FROM OrderItem oi WHERE oi.orderId=t0.id) itemsInfo"] ],...]
}
这篇关于筋斗云接口编程 / 虚拟字段(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!