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

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/580014

相关文章

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

C++链表的虚拟头节点实现细节及注意事项

《C++链表的虚拟头节点实现细节及注意事项》虚拟头节点是链表操作中极为实用的设计技巧,它通过在链表真实头部前添加一个特殊节点,有效简化边界条件处理,:本文主要介绍C++链表的虚拟头节点实现细节及注... 目录C++链表虚拟头节点(Dummy Head)一、虚拟头节点的本质与核心作用1. 定义2. 核心价值二

mysql查询使用_rowid虚拟列的示例

《mysql查询使用_rowid虚拟列的示例》MySQL中,_rowid是InnoDB虚拟列,用于无主键表的行ID查询,若存在主键或唯一列,则指向其,否则使用隐藏ID(不稳定),推荐使用ROW_NUM... 目录1. 基本查询(适用于没有主键的表)2. 检查表是否支持 _rowid3. 注意事项4. 最佳实

SpringBoot+Redis防止接口重复提交问题

《SpringBoot+Redis防止接口重复提交问题》:本文主要介绍SpringBoot+Redis防止接口重复提交问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录前言实现思路代码示例测试总结前言在项目的使用使用过程中,经常会出现某些操作在短时间内频繁提交。例

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor

MybatisPlus service接口功能介绍

《MybatisPlusservice接口功能介绍》:本文主要介绍MybatisPlusservice接口功能介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录Service接口基本用法进阶用法总结:Lambda方法Service接口基本用法MyBATisP

SpringBoot3中使用虚拟线程的完整步骤

《SpringBoot3中使用虚拟线程的完整步骤》在SpringBoot3中使用Java21+的虚拟线程(VirtualThreads)可以显著提升I/O密集型应用的并发能力,这篇文章为大家介绍了详细... 目录1. 环境准备2. 配置虚拟线程方式一:全局启用虚拟线程(Tomcat/Jetty)方式二:异步

Java中的Closeable接口及常见问题

《Java中的Closeable接口及常见问题》Closeable是Java中的一个标记接口,用于表示可以被关闭的对象,它定义了一个标准的方法来释放对象占用的系统资源,下面给大家介绍Java中的Clo... 目录1. Closeable接口概述2. 主要用途3. 实现类4. 使用方法5. 实现自定义Clos

Linux网络配置之网桥和虚拟网络的配置指南

《Linux网络配置之网桥和虚拟网络的配置指南》这篇文章主要为大家详细介绍了Linux中配置网桥和虚拟网络的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、网桥的配置在linux系统中配置一个新的网桥主要涉及以下几个步骤:1.为yum仓库做准备,安装组件epel-re