# 混合操作
* * * * *
前面大家只了解到TP5的DB操作与OneBase的DB操作,实际上因为OB的继承关系及设计在同一个模型对象上可以进行混合操作。
下面来看一下使用场景
![](https://box.kancloud.cn/4ae983ec6ff0cee3e74a540d9c2feda9_1917x641.jpg)
![](https://box.kancloud.cn/74715676e04ef5a50d0f0df9a3e46a12_662x311.jpg)
图中可以看到公会添加的功能,前面都是公会信息,但是公会需要与用户进行关联并允许登录后台,这样就涉及到 添加会员与添加公会 两个业务逻辑。
若将两个业务进行拆分,先到会员管理中添加会员,再到公会管理中添加公会并关联会员,这样会对产品体验上有一定的影响,虽然开发者觉得合理但是对于系统运营者来讲他却需要操作两遍新增功能,且不在同一个位置,操作起来会比较耽误时间。
下面问题来了。
从表结构中可以看到 公会表中有个member_id字段,用于保存管理员会员ID。
那我添加公会怎么知道会员ID? 这意味着咱们得先添加会员,但是在OneBase封装的setInfo方法中并没有返回主键ID。
这里有3个方案,比如 在ModelBase中新增一个通用方法,调整一下setInfo参数或返回值,OneBase封装方法与TP5方法混合使用。
~~~
/**
* 公会添加
*/
public function conferenceAdd($data = [])
{
if (!$this->validateConference->scene('add')->check($data)) {
return [RESULT_ERROR, $this->validateConference->getError()];
}
$func = function () use ($data) {
$member['nickname'] = $member['username'] = $data['username'];
$member['password'] = data_md5_key($data['password']);
$member['leader_id'] = MEMBER_ID;
$member['is_inside'] = DATA_NORMAL;
$data['member_id'] = $this->modelMember->insertGetId($member);
$data['source_member_id'] = MEMBER_ID;
action_log('新增', '新增会员,username:' . $member['username']);
$this->modelWgConference->setInfo($data) && action_log('新增', '新增公会,conference_name:' . $data['conference_name']);
};
return closure_list_exe([$func]) ? [RESULT_SUCCESS, '操作成功', url('conferenceList')] : [RESULT_ERROR, '公会添加失败'];
}
~~~
上面的代码中可以看到setInfo方法的使用,但是仔细观察会发现insertGetId方法并不在ModelBase类中。
这就是混合操作,OneBase会优先查找自己的方法,若存在则执行,若不存在则会从TP5的Model类中寻找。
所以有了这个特性 当开发者不想新增方法也不想动OneBase的方法时,就可以使用混合操作。^_^
- 序言
- 基础
- 安装环境
- 安装演示
- 规范
- 目录
- 介绍
- 后台介绍
- 后台首页
- 会员管理
- 系统管理
- 系统设置与配置管理
- 菜单管理
- 系统回收站
- 服务管理
- 插件管理
- 文章管理
- 接口管理
- 优化维护
- SEO管理
- 数据库
- 文件清理
- 行为日志
- 执行记录
- 统计分析
- 接口介绍
- 接口文档
- 错误码设计
- Token介绍
- 前台介绍
- 架构
- 架构总览
- 生命周期
- 入口文件
- 模块设计
- 依赖注入
- 控制器架构
- 逻辑架构
- 验证架构
- 服务架构
- 模型架构
- 行为架构
- 插件架构
- 配置
- 配置介绍
- 配置加载
- 配置扩展
- 请求
- 请求信息
- 日志
- 后台行为日志
- 系统执行日志
- 框架日志
- 数据
- 数据库设计
- 数据字典
- 数据库操作
- 事务控制
- 混合操作
- 实战
- 控制器
- 逻辑与验证
- 视图与模型
- 插件研发
- 服务研发
- 接口研发
- 杂项
- 数据导入导出
- 二维码条形码
- 邮件发送
- 云存储服务
- 支付服务
- 短信服务
- 微信分享
- 生成海报
- 聊天室
- PJAX
- Demo
- Widget
- 附录
- 常量参考
- 配置参考
- 函数参考
- 进阶
- Redis
- 自动缓存
- 全自动缓存
- 索引
- 数据签名
- 全自动事务
- 队列