首页 > 主页 > 鬼谷子叔叔
日志:357 评论:13
北京, 西城
【TFWEB】TFWEB模型说明V2.0

模型

介绍

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)
{

}

CRUD操作

插入数据

插入数据通过模型方法 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);

模型方法

get

返回模型数据

$dataInfo = $myModelObj->get($ID);

ncGet

强制直接从数据库返回模型数据

$dataInfo = $myModelObj->ncGet($ID);

gets

返回一组模型数据

$dataInfos = $myModelObj->gets($IDList);

getID

返回模型主键

$dataId = $myModelObj->getID($UKValue);

ncGetID

强制直接从数据库返回模型主键

$dataId = $myModelObj->ncGetID($UKValue);

getLIID

返回模型自增列值

$autoId = $myModelObj->getLIID();

add

插入数据,传入模型数据表的数据数组

$myModelObj->add(array('name'=>$name, 'date'=>$date));

mod

更新数据,传入模型数据表主键和数据数组

$myModelObj->add($ID, array('name'=>$name));

del

删除数据,传入模型数据表主键

$myModelObj->del($ID);