一、描述
Model是操作数据库的基础对象,当前仅支持MySQL,内置了一系列的方法。有如下特性:
1)支持 @Inject() 注解实例化
2)支付 Model::M() 静态化调用
3)支持多表Join、Left Join、Group By
4)支持指定索引 (force index)
5)支持注册字段值变化事件(指定某字段被插入、更新操作时,触发事件)
注:Model的调用可以在任何地方(Controller、Logic、Service等等)使用
二、注解实例化示例
<?php
namespace 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()静态化
<?php
namespace 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底层注册指定字段有【插入、更新】操作时,触发指定回调事件,三个操作可分别单独注册。例:
<?php
namespace 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的数据)