一、描述
Model是操作数据库的基础对象,当前仅支持MySQL,内置了一系列的方法。有如下特性:
1)支持 @Inject() 注解实例化
2)支付 Model::M() 静态化调用
3)支持多表Join、Left Join、Group By
4)支持指定索引 (force index)
5)支持注册字段值变化事件(指定某字段被插入、更新操作时,触发事件)
注:Model的调用可以在任何地方(Controller、Logic、Service等等)使用
二、注解实例化示例
<?phpnamespace App\Module\Topd\Logic\Omr;class DayLogic extends BeanCollector{/*** @Inject() //----- 使用注解 @Inject() 声明入库 -----//* @var OmrRptDayModel //----- 指定要被实例化的实例Model类 -----//*/private $omrRptDayModel; //----- 定义存放实例后的变量 -----///*** 获取新闻列表* @return array*/public function getNews(...){//本例:获取列表$list = $this->omrRptDayModel->getList(...);//本例:更新数据$this->omrRptDayModel->update([...]);//本例:删除数据$this->omrRptDayModel->delete([...]);}}
核心实例化代码是
<?php/*** @Inject() //----- 使用注解 @Inject() 声明入库 -----//* @var OmrRptDayModel //----- 指定要被实例化的实例Model类 -----//*/private $omrRptDayModel; //----- 定义存放实例后的变量 -----//
三、Model::M()静态化
<?phpnamespace App\Module\Topd\Logic\Omr;class DayLogic extends BeanCollector{/*** 获取XXX列表* @return array*/public function getList(...){//本例:获取列表$list = OmrRptDayModel::M()->getList(...); //----- 区别:没有变量 -----////本例:更新数据OmrRptDayModel::M()->update([...]);//本例:删除数据OmrRptDayModel::M()->delete([...]);}}
此种方式有如下优点:
1)代码简洁
2)减少初始化时间
3)随时使用,不用预实例化
推荐使用此种方法与DB交互!
四、Join用法
<?php//连接两个表$list = UserModel::M() //-- User -> A --//->join(TestModel::M(), ['id' => 'uid']) //-- Test -> B on A.id=B.uid --//->getList($where, '*', $orderBy, $size, $idx);//连接多个表(第一个为主表,其它为副表)$list = UserModel::M() //-- User -> A --//->join(TestModel::M(), ['id' => 'uid']) //-- Test -> B on A.id=B.uid --//->join(SortModel::M(), ['id' => 'sid']) //-- Sort -> C on A.id=C.sid --//->getList($where, '*', $orderBy, $size, $idx);//连接多个表(第一个为主表,第三个表与第二表关联)$list = UserModel::M() //-- User -> A --//->join(TestModel::M(), ['id' => 'uid']) //-- Test -> B on A.id=B.uid --//->join(SortModel::M(), ['B.sid' => 'sid']) //-- Sort -> C on B.sid=C.sid --//->getList($where, '*', $orderBy, $size, $idx);
Join (leftJoin)含有2个参数
| 参数名 | 类型 | 例子 |
|---|---|---|
| 第一参数 | 实例化后的Model对象 支持:1)注释后的Model变量 2)Model::M()静态实例 |
使用注解时:$this->omrRptDayModel 使用静态时:TestModel::M() |
| 第二参数 | 关联的关系,即 SQL 中的 ON 是一维的数组: 左边(KEY):左表的字段 右边(VAL):右表的字段 |
[‘id’ => ‘uid’] — 默认左边是A,右边是当前别名,如B、C [‘B.id’ => ‘uid’] — 仅支持左边变更表别名 |
注:1)Model对象join的顺序,表的别名从A->Z自动增长;
2)leftJoin 用法与 join 一致
Join支持以下操作
| 方法名 | 功能作用 |
|---|---|
| getList | 获取列表数据 |
| getSum | 对字段进行合计 |
| getRow | 通过条件获取一行数据 |
| getCount | 获取行数数量 |
| getDistinct | 获取某个字段唯一值列表(返回一维数组) |
五、强制索引(force index)
解决在DB层无法精确命中索引,而强制使用指定索引。
在$where的对像中传入$index 参数,如
<?php//数据条件$where = ['user' => 1,'$index' => 'idx_user'];$list = UserModel::M()->getList($where);
注:强制索引只能用于获取数据和部分删除操作,对更新无效
六、注册监听
在DB底层注册指定字段有【插入、更新】操作时,触发指定回调事件,三个操作可分别单独注册。例:
<?phpnamespace App\Model\Prd;use Swork\Db\MySqlModel;use ......class PrdOrderModel extends MySqlModel implements MySqlMonitorInterface{public function __construct(){$tbl = 'prd_order';$key = ['oid', MySqlModel::KeyID];$cols = ['oid' => ['s', ''],'recstat' => ['i', 0],...];$inc = '';parent::__construct($tbl, $key, $cols, $inc);}/*** 注册插入数据监听* @return array|bool*/public function registerInsertMonitor(){return false;}/*** 注册更新数据监听* @return array|bool*/public function registerUpdateMonitor(){return ['recstat'];}/*** 监听插入数据回调* @param string $keyId 监控的回传主键ID* @param array $data 监控的回传数据*/public function insertMonitorCallback(string $keyId, array $data){}/*** 监听更新数据回调* @param array $where 当时运行的数据条件* @param array $data 监控的回传数据*/public function updateMonitorCallback(array $where, array $data){//回调做指定的事情}}
1)Model表实体类继承并实现 MySqlMonitorInterface 接口
2)registerInsertMonitor 注册插入事件;registerUpdateMonitor 注册更新事件
返回 false 表示不监听;返回字符数组(字段数组),则表示监控的字段
3)insertMonitorCallback 插入回调事件;updateMonitorCallback 更新回调事件;
$where — 当前操作数据时的数据条件
$data — 当前操作数据时的数据条件中的数据(非操作DB的数据)
