虚拟字段用法 C语言,虚拟字段(一)

前面已经学习过怎样把一个数据库中的表作为对象暴露出去。

其中,表的字段就可直接映射为对象的属性。对于不在对象主表中定义的字段,统称为虚拟字段。

通过$vcolDefs来定义虚拟字段,最简单的一类虚拟字段是字段别名,比如

class AC1_Ordr extends AccessControl

{

protected $vcolDefs = [

[ "res" => ["t0.id orderId", "t0.dscr description"] ],

]

}

这样就为Ordr对象增加了orderId与description两个虚拟字段。

在get/query接口中,是可以用它们作为查询字段的,比如:

Ordr.query(cond="orderId>100 and description like '红色'")

在query接口中,虚拟字段与真实字段使用起来几乎没有区别。对外接口只有对象名,没有表名的概念,比如不允许在cond参数中指定"t0.orderId>100"。

关联字段

[任务]

在订单的query/get接口中,只有userId字段,为了方便显示用户姓名和手机号,需要增加虚拟字段userName, userPhone字段。

另外,还需要增加虚拟字段“订单创建时间” - createTm,实现时这个字段需要从OrderLog表中获取。

设计文档中定义接口如下:

Ordr.query() -> tbl(id, dscr, ..., userName?, userPhone?, createTm?)

其中userName/userPhone字段分别关联到User.name和User.phone字段的,而createTm字段是关联到OrderLog.tm字段的。

习惯上,我们在query或get接口的字段列表中加"..."表示参考数据表定义中的字段,而"..."之后描述的就是虚拟字段。

虚拟字段上的后缀"?"表示该字段默认不返回,仅当在res参数中指定才会返回,如:

Ordr.query(res="*,userName")

一般虚拟字段都建议默认不返回,而是按需来取,以减少关联表或计算带来的开销。

在cond参数中可以直接使用虚拟字段,不管它是否在res参数中指定,如

Ordr.query(cond="userName LIKE '%john%'", res="id,dscr")

实现时,通过设置属性$vcolDefs实现这些关联字段:

class AC1_Ordr extends AccessControl

{

protected $vcolDefs = [

[

"res" => ["u.name AS userName", "u.phone AS userPhone"],

"join" => "INNER JOIN User u ON u.id=t0.userId",

// "default" => false, // 与接口原型中字段是否可缺省(是否用"?"标记)对应

],

[

"res" => ["log_cr.tm AS createTm"],

"join" => "LEFT JOIN OrderLog log_cr ON log_cr.action='CR' AND log_cr.orderId=t0.id",

]

]

}

以上很多表或字段指定了别名,比如表"User u",字段"u.name AS userName"。在指定别名时,关键字"AS"可以省略。

表的别名不是必须的,除非有多个同名的表被引用。

如果指定"default"选项为true, 则调用Ordr.query()时如果未指定"res"参数,会默认会带上该字段。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值