筋斗云接口编程 / 虚拟字段

2024-01-07 13:08
文章标签 接口 编程 虚拟 筋斗云

本文主要是介绍筋斗云接口编程 / 虚拟字段,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

虚拟字段

前面已经学习过怎样把一个数据库中的表作为对象暴露出去。
其中,表的字段就可直接映射为对象的属性。对于不在对象主表中定义的字段,统称为虚拟字段。

通过$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”参数,会默认会带上该字段。
关联字段依赖

假设设计有“订单评价”对象,它与“订单”相关联:

@Rating: id, orderId, content

一个订单可有多个评价,表间的关系为:

订单评价Rating(orderId) n<->1 订单Ordr
订单Ordr(userId) n<->1 用户User

现在要为Rating表增加关联字段订单描述 “Ordr.dscr AS orderDscr”, 以及客户姓名 “User.name AS userName”, 设计接口为:

Rating.query() -> tbl(id, orderId, content, ..., orderDscr?, userName?)

注意:userName字段不直接与Rating表关联,而是通过Ordr表桥接过去。

如果这样定义:

class AC1_Rating extends AccessControl
{protected $vcolDefs = [["res" => ["o.dscr AS orderDscr"],"join" => "INNER JOIN Ordr o ON o.id=t0.orderId",],["res" => ["u.name AS userName"],"join" => "INNER JOIN User u ON o.userId=u.id",],];
}

这样查询是没有问题的:

Rating.query(res="id,orderDscr,userName")

但如果这样查询(只查User表上)

Rating.query(res="id,userName")

这时将出错, 因为框架只知道userName字段需要联接User表, 而不知道必须先联接Ordr表.

一种解决方案是将两个表写在一起:

class AC1_Rating extends AccessControl
{protected $vcolDefs = [["res" => ["o.dscr AS orderDscr", "u.name AS userName"],"join" => "INNER JOIN Ordr o ON o.id=t0.orderId INNER JOIN User u ON o.userId=u.id",]];
}

其缺点是, 即使是只查询Ordr表的orderDscr字段, 也要联接User表, 而这是不必要的.

正确做法是,在vcolDefs中可以使用require选项指定依赖字段:

class AC1_Rating extends AccessControl
{protected $vcolDefs = [["res" => ["o.dscr AS orderDscr"],"join" => "INNER JOIN Ordr o ON o.id=t0.orderId",],["res" => ["u.name AS userName"],"join" => "INNER JOIN User u ON o.userId=u.id","require" => "userId" // *** 定义依赖,如果要用到res中的字段如userName,则自动添加orderDscr字段引入的表关联。]];
}

这篇关于筋斗云接口编程 / 虚拟字段的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/580015

相关文章

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

Spring Boot3虚拟线程的使用步骤详解

《SpringBoot3虚拟线程的使用步骤详解》虚拟线程是Java19中引入的一个新特性,旨在通过简化线程管理来提升应用程序的并发性能,:本文主要介绍SpringBoot3虚拟线程的使用步骤,... 目录问题根源分析解决方案验证验证实验实验1:未启用keep-alive实验2:启用keep-alive扩展建

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

如何用java对接微信小程序下单后的发货接口

《如何用java对接微信小程序下单后的发货接口》:本文主要介绍在微信小程序后台实现发货通知的步骤,包括获取Access_token、使用RestTemplate调用发货接口、处理AccessTok... 目录配置参数 调用代码获取Access_token调用发货的接口类注意点总结配置参数 首先需要获取Ac

讯飞webapi语音识别接口调用示例代码(python)

《讯飞webapi语音识别接口调用示例代码(python)》:本文主要介绍如何使用Python3调用讯飞WebAPI语音识别接口,重点解决了在处理语音识别结果时判断是否为最后一帧的问题,通过运行代... 目录前言一、环境二、引入库三、代码实例四、运行结果五、总结前言基于python3 讯飞webAPI语音

MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析

《MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析》本文将详细讲解MyBatis-Plus中的lambdaUpdate用法,并提供丰富的案例来帮助读者更好地理解和应... 目录深入探索MyBATis-Plus中Service接口的lambdaUpdate用法及示例案例背景

Java8需要知道的4个函数式接口简单教程

《Java8需要知道的4个函数式接口简单教程》:本文主要介绍Java8中引入的函数式接口,包括Consumer、Supplier、Predicate和Function,以及它们的用法和特点,文中... 目录什么是函数是接口?Consumer接口定义核心特点注意事项常见用法1.基本用法2.结合andThen链

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll