筋斗云接口编程 / 虚拟表和视图

编程入门 行业动态 更新时间:2024-10-26 16:29:55

筋斗云接口编程 / 虚拟表和<a href=https://www.elefans.com/category/jswz/34/1770164.html style=视图"/>

筋斗云接口编程 / 虚拟表和视图

虚拟表和视图

表ApiLog中有一个字段叫app,表示前端应用名:

@ApiLog: id, tm, addr, app, userId- userId: 如果app=user,则关联到User表;如果app=emp,则关联到员工表Employee@Employee: id, name, phone, ...
@User: id, ...

当app=”emp”时,就表示是员工端应用的操作日志。
现在想对员工端操作日志进行查询,定义以下接口:

EmpLog.query() -> tbl(id, tm, userId, ac, ..., empName?, empPhone?)返回
- empName/empPhone: 关联字段,通过userId关联到Employee表的name/phone字段。应用逻辑
- 权限:AUTH_EMP

EmpLog是一个虚拟对象或虚拟表,实现时,一种办法是可以在数据库定义一个视图,如:

CREATE VIEW EmpLog AS
SELECT t0.id, tm, userId, ac, e.name empName, e.phone empPhone
FROM ApiLog t0
LEFT JOIN Employee e ON e.id=t0.userId
WHERE t0.app='emp' AND t0.userId IS NOT NULL
ORDER BY t0.id DESC

然后可将该视图当作表一样查询(但不可更新),如:

class AC2_EmpLog extends AccessControl 
{protected $allowedAc = ["query"];
}

这样就可以实现上述接口了。

另一种办法是直接使用AccessControl创建虚拟表,代码如下:

class AC2_EmpLog extends AccessControl 
{protected $allowedAc = ["query"];protected $table = 'ApiLog';protected $defaultSort = "t0.id DESC";protected $defaultRes = "id, tm, userId, ac, req, res, reqsz, ressz, empName, empPhone";protected $vcolDefs = [["res" => ["e.name AS empName", "e.phone AS empPhone"],"join" => "LEFT JOIN Employee e ON e.id=t0.userId"]];// get/query操作都会走这里protected function onQuery() {$this->addCond("t0.app='emp' and t0.userId IS NOT NULL");}
}

与上例相比,它不仅无须在数据库中创建视图,还也可以进行更新。
其要点是:

  • 重写$table属性, 定义实际表
  • 用属性$vcolDefs定义虚拟字段
  • 用addCond方法添加缺省查询条件

属性$defaultSort$defaultRes可用于定义缺省返回字段及排序方式。

在get/query接口中可以用”res”指定返回字段,如果未指定,则会返回除了$hiddenFields定义的字段之外,所有主表中的字段,还会包括设置了default=>true的虚拟字段。
通过$defaultRes可以指定缺省返回字段列表。

query接口中可以通过”orderby”来指定排序方式,如果未指定,默认是按id排序的,通过$defaultSort可以修改默认排序方式。

更多推荐

筋斗云接口编程 / 虚拟表和视图

本文发布于:2024-02-10 16:25:41,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1676213.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:视图   接口   筋斗云

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!