本文主要是介绍筋斗云接口编程 / 子表对象,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
子表对象
前面提到过想在对象中返回子表时,可以使用压缩成一个字符串的子表字段,一般适合数据比较简单的场合。
另一种方式是用$subobj
来定义子表对象。
例如在获取订单时,同时返回订单日志,设计接口如下:
Ordr.get() -> {id, ..., @orderLog?}返回
orderLog: {id, tm, dscr, action} 订单日志子表。示例{id: 1, dscr: "换轮胎及洗车", ..., orderLog: [{id: 1, tm: "2016-1-1 10:10", action: "CR", dscr: "创建订单"},{id: 2, tm: "2016-1-1 10:20", action: "PA", dscr: "付款"}
]}
上面接口原型描述中,字段orderLog前面的”@”标记表示它是一个数组,在返回值介绍中列出了它的数据结构。
实现:
class AC1_Ordr extends AccessControl
{protected $subobj = ["orderLog" => ["sql"=>"SELECT ol.* FROM OrderLog ol WHERE ol.orderId=%d"]];
}
用选项”sql”定义子表的查询语句,其中用”%d”来表示主表主键,这里即Ordr.id字段。
定义子表对象时,还可设置一些选项,比如上面设置等价于:
"orderLog" => ["sql"=>..., "wantOne"=>false, "default"=>false]
选项”wantOne”表示是否只返回一行。默认是返回一个对象数组,如
[{id, tm, ...}]
。
如果选项”wantOne”为true,则结果以一个对象返回即{id, tm, ...}
, 适用于主表与子表一对一的情况。选项”default”与虚拟字段(vcolDefs)上的”default”选项一样,表示当get或query接口未指定”res”参数时,是否默认返回该字段。
一般应使用默认值false,客户端需要时应通过res参数指定,如Ordr.query(res="*,orderLog")
.
注意:查询子表作为子对象字段是不支持分页的。如果子表可能很大,不要设计使用子表字段或列表字段,而应直接用子表的query方法来取,如开放接口”OrderLog.query”。
这篇关于筋斗云接口编程 / 子表对象的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!