TFWEB的模型存储于 WEB-INF/Classes/Models 目录下面,对象继承自基类 TFAction,用于完成基本的数据存取操作。
一个模型对象对应着数据库当中的一张数据表。
class TFModel_xxx extends TFAction { public function __construct($PEO) { // 调用基类构造器函数 parent::__construct( $PEO, // PEO 句柄 "#xxx#", // 模型数据表名称 "id", // 模型数据表主键字段名称 TFActionPKType::T_PK_AUTO // 模型数据表主键模式 ); // 设置数据源名称,默认使用 PEO->dbDefault 连接数据库 $this->setDBOName('xxx'); // 设置自动缓存名称,默认为模型基本名称,本例为 xxx $this->setCacheName("xxx"); // 设置自动缓存参数,默认为TFActionCacheMode::T_MODE_NONE,即不自动缓存 $this->setCacheMode(TFActionCacheMode::T_MODE_SINGLE); // 设置约束名称 $this->setOpt('UKName', "title"); } }
一张数据表对应一个模型对象
在添加数据、修改数据的时候主键字段必须给定有效值
如果设置了约束,在添加数据、修改数据的时候约束字段必须给定有效值
TFAction支持自动缓存数据,即可以在数据发生变化的时候自动将数据写入到缓存引擎当中
不同模型之间的自动缓存名称要保证唯一
在模型构造器里设置自动缓存参数
$this->setCacheMode(TFActionCacheMode::T_MODE_SINGLE);
自动缓存会在数据的增加、修改、删除操作之后自动执行
自动缓存开启后,模型的 get/gets/getID 方法会优先从缓存当中获取数据,取不到数据时候才会去数据库当中获取数据
大大减少读库频率,提高执行效率
自动缓存是在执行 insert、update、delete 语句之后自动执行写入缓存引擎的,如果我们使用了事务(transaction)模式,当遇到意外放弃 Commit 的时候,或者执行 Rollback 回滚的时候,数据并没有存储到数据库当中,但是缓存已经写入缓存引擎,导致数据不一致
为了解决这个问题,我们可以开启转移自动缓存,就是在数据变化的时候只是自动删除缓存,而不会自动写入缓存
开启转移自动缓存后,缓存需要自己通过 php_mysql_replication 技术去捕获数据变化,自己写入缓存引擎
开启转移自动缓存需要定义常量 TFWEB_ACTION_DISABLE_AUTO_CACHE
define('TFWEB_ACTION_DISABLE_AUTO_CACHE', true);
protected function onAdd(array $dataArr) { }
protected function onMod(string $ID, array $dataArr) { }
protected function onDel(string $ID) { }
protected function onGetID(string $ID) { }
protected function onGetLIID(string $ID) { }
插入数据通过模型方法 add 完成,返回值为布尔值 boolean,成功为真,否则为假
如果数据表有自增字段,可以通过方法 getLIID 获取新数据的自增字段的值
$myXXXObj = new TFModel_xxx($this->PEO); $myXXXObj->add(array('name'=>"张三", 'nick'=>"小张", 'createDT'=>date("Y-m-d H:i:s"))); $newID = $myXXXObj->getLIID();
更新数据通过模型方法 mod 完成,返回值为布尔值 boolean,成功为真,否则为假
更新数据需要提供数据表主键,如果是多主键数据表,则需要将多个主键字段的值以“,”拼接到一起作为主键值传入
$myXXXObj = new TFModel_xxx($this->PEO); $myXXXObj->mod($ID, array('nick'=>"张生"));
通过主键读取数据,成功返回一维数组,否则为假
$myXXXObj = new TFModel_xxx($this->PEO); $dataInfo = $myXXXObj->get($ID);
删除数据通过模型方法 del 完成,返回值为布尔值 boolean,成功为真,否则为假
删除数据需要提供数据表主键,如果是多主键数据表,则需要将多个主键字段的值以“,”拼接到一起作为主键值传入
$myXXXObj = new TFModel_xxx($this->PEO); $myXXXObj->del($ID);
如果设置了约束,我们就可以通过约束字段反查主键值
如果是多字段约束,则需要把多字段的值以“,”拼接到一起传入
如果是多字段主键,则方法会把多字段的值以“,”拼接到一起返回
如果未设置约束,则方法返回 false
$myXXXObj = new TFModel_xxx($this->PEO); $ID = $myXXXObj->getID($name);
返回模型数据
$dataInfo = $myModelObj->get($ID);
强制直接从数据库返回模型数据
$dataInfo = $myModelObj->ncGet($ID);
返回一组模型数据
$dataInfos = $myModelObj->gets($IDList);
返回模型主键
$dataId = $myModelObj->getID($UKValue);
强制直接从数据库返回模型主键
$dataId = $myModelObj->ncGetID($UKValue);
返回模型自增列值
$autoId = $myModelObj->getLIID();
插入数据,传入模型数据表的数据数组
$myModelObj->add(array('name'=>$name, 'date'=>$date));
更新数据,传入模型数据表主键和数据数组
$myModelObj->add($ID, array('name'=>$name));
删除数据,传入模型数据表主键
$myModelObj->del($ID);