本文主要是介绍筋斗云接口编程 / 虚拟表和视图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
虚拟表和视图
表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
可以修改默认排序方式。
这篇关于筋斗云接口编程 / 虚拟表和视图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!