一、描述

Model是操作数据库的基础对象,当前仅支持MySQL,内置了一系列的方法。有如下特性:
1)支持 @Inject() 注解实例化
2)支付 Model::M() 静态化调用
3)支持多表Join、Left Join、Group By
4)支持指定索引 (force index)
5)支持注册字段值变化事件(指定某字段被插入、更新操作时,触发事件)

注:Model的调用可以在任何地方(Controller、Logic、Service等等)使用

二、注解实例化示例

  1. <?php
  2. namespace App\Module\Topd\Logic\Omr;
  3. class DayLogic extends BeanCollector
  4. {
  5. /**
  6. * @Inject() //----- 使用注解 @Inject() 声明入库 -----//
  7. * @var OmrRptDayModel //----- 指定要被实例化的实例Model类 -----//
  8. */
  9. private $omrRptDayModel; //----- 定义存放实例后的变量 -----//
  10. /**
  11. * 获取新闻列表
  12. * @return array
  13. */
  14. public function getNews(...)
  15. {
  16. //本例:获取列表
  17. $list = $this->omrRptDayModel->getList(...);
  18. //本例:更新数据
  19. $this->omrRptDayModel->update([...]);
  20. //本例:删除数据
  21. $this->omrRptDayModel->delete([...]);
  22. }
  23. }

核心实例化代码是

  1. <?php
  2. /**
  3. * @Inject() //----- 使用注解 @Inject() 声明入库 -----//
  4. * @var OmrRptDayModel //----- 指定要被实例化的实例Model类 -----//
  5. */
  6. private $omrRptDayModel; //----- 定义存放实例后的变量 -----//

三、Model::M()静态化

  1. <?php
  2. namespace App\Module\Topd\Logic\Omr;
  3. class DayLogic extends BeanCollector
  4. {
  5. /**
  6. * 获取XXX列表
  7. * @return array
  8. */
  9. public function getList(...)
  10. {
  11. //本例:获取列表
  12. $list = OmrRptDayModel::M()->getList(...); //----- 区别:没有变量 -----//
  13. //本例:更新数据
  14. OmrRptDayModel::M()->update([...]);
  15. //本例:删除数据
  16. OmrRptDayModel::M()->delete([...]);
  17. }
  18. }

此种方式有如下优点:
1)代码简洁
2)减少初始化时间
3)随时使用,不用预实例化
推荐使用此种方法与DB交互!

四、Join用法

  1. <?php
  2. //连接两个表
  3. $list = UserModel::M() //-- User -> A --//
  4. ->join(TestModel::M(), ['id' => 'uid']) //-- Test -> B on A.id=B.uid --//
  5. ->getList($where, '*', $orderBy, $size, $idx);
  6. //连接多个表(第一个为主表,其它为副表)
  7. $list = UserModel::M() //-- User -> A --//
  8. ->join(TestModel::M(), ['id' => 'uid']) //-- Test -> B on A.id=B.uid --//
  9. ->join(SortModel::M(), ['id' => 'sid']) //-- Sort -> C on A.id=C.sid --//
  10. ->getList($where, '*', $orderBy, $size, $idx);
  11. //连接多个表(第一个为主表,第三个表与第二表关联)
  12. $list = UserModel::M() //-- User -> A --//
  13. ->join(TestModel::M(), ['id' => 'uid']) //-- Test -> B on A.id=B.uid --//
  14. ->join(SortModel::M(), ['B.sid' => 'sid']) //-- Sort -> C on B.sid=C.sid --//
  15. ->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 参数,如

  1. <?php
  2. //数据条件
  3. $where = [
  4. 'user' => 1,
  5. '$index' => 'idx_user'
  6. ];
  7. $list = UserModel::M()->getList($where);

注:强制索引只能用于获取数据和部分删除操作,对更新无效

六、注册监听

在DB底层注册指定字段有【插入、更新】操作时,触发指定回调事件,三个操作可分别单独注册。例:

  1. <?php
  2. namespace App\Model\Prd;
  3. use Swork\Db\MySqlModel;
  4. use ......
  5. class PrdOrderModel extends MySqlModel implements MySqlMonitorInterface
  6. {
  7. public function __construct()
  8. {
  9. $tbl = 'prd_order';
  10. $key = ['oid', MySqlModel::KeyID];
  11. $cols = [
  12. 'oid' => ['s', ''],
  13. 'recstat' => ['i', 0],
  14. ...
  15. ];
  16. $inc = '';
  17. parent::__construct($tbl, $key, $cols, $inc);
  18. }
  19. /**
  20. * 注册插入数据监听
  21. * @return array|bool
  22. */
  23. public function registerInsertMonitor()
  24. {
  25. return false;
  26. }
  27. /**
  28. * 注册更新数据监听
  29. * @return array|bool
  30. */
  31. public function registerUpdateMonitor()
  32. {
  33. return ['recstat'];
  34. }
  35. /**
  36. * 监听插入数据回调
  37. * @param string $keyId 监控的回传主键ID
  38. * @param array $data 监控的回传数据
  39. */
  40. public function insertMonitorCallback(string $keyId, array $data)
  41. {
  42. }
  43. /**
  44. * 监听更新数据回调
  45. * @param array $where 当时运行的数据条件
  46. * @param array $data 监控的回传数据
  47. */
  48. public function updateMonitorCallback(array $where, array $data)
  49. {
  50. //回调做指定的事情
  51. }
  52. }

1)Model表实体类继承并实现 MySqlMonitorInterface 接口
2)registerInsertMonitor 注册插入事件;registerUpdateMonitor 注册更新事件
返回 false 表示不监听;返回字符数组(字段数组),则表示监控的字段
3)insertMonitorCallback 插入回调事件;updateMonitorCallback 更新回调事件;
$where — 当前操作数据时的数据条件
$data — 当前操作数据时的数据条件中的数据(非操作DB的数据)