高级模型
class TestModel extends AdvModel{}
实现功能:
1,字段过滤:对字段信息的写入,读取 分别定义函数,对字段数据进行操作
protected $_filter=array(
'过滤字段'=>array('写入处理函数',读取处理函数,[是否传入整个数据对象]), //第三个参数,如果没有则是传入该字段作为参数,否则传入整个数据对象作为函数参数
)
2,序列化字段:在model中对多个数据字段自动进行串行化处理,在Action中正常操作
protected $serializeField=array(
'串行化后保存的字段'=>array('字段1','字段2','字段n'), //串行化字段里同时保存多个字段的内容
);
3,文本字段--根本没理解什么有什么鸟必要. protected $blobFields=array('文本字段名');
4,只读字段--写入的数据不能被修改(修改操作的时候自动过滤的设定的只读字段) protected $readonlyField=array('只读字段1','只读字段2');
5,乐观锁,悲观锁
悲观锁,数据库的锁定机制,悲观锁缺点:数据库锁定,影响其他的并发操作.
$obj->lock(true)->save($data); //悲观锁修改操作
乐观锁,通过在数据库设定记录version字段,通过version来进行判断操作,不锁定全库(必须建立锁版本字段).
在model类(继承AdvModel)中,protected $optimLock='记录版本的字段'; //不设置默认字段是lock_version. 只需在对应表中添加lock_version字段即可
//如果要关闭乐观锁 protected $optimLock=false;
6,延迟更新,
对于更新频繁并且 实时性较低的 操作,设置个延迟的时间,所有的更新操作在延迟时间后统一更新.延迟更新的好处,减轻数据库负荷/压力.
格式:
$model->where('id=n')->setlnc('字段',[数值]);//自增 ,自减用setdec();
$model->where('id=n')->setLazylnc('字段',数值,延迟x秒); //延迟自增x秒 ,延迟自减用setLazyDec();
使用,
$User->where('id=3')->setInc("score",10); //实时+10
$User->where('id=3')->setInc("score",30); //实时+30
$User->where('id=3')->setInc("score",10); //实时+10
$User->where('id=3')->setLazyInc("score",10,60); //延迟60秒 +10
$User->where('id=3')->setLazyInc("score",30,60); //延迟60秒 +30
$User->where('id=3')->setLazyInc("score",10,60); //延迟60秒 +10
//相当与60秒后+50 $User->where('id=3')->setInc("score",50);
7,数据分表(没有做实验,只是个人理解)--->横切
protected $partition = array(
'field' => 'name',// 要分表的字段 通常数据会根据某个字段的值按照规则进行分表
'type' => 'md5',// 分表的规则 包括id year mod md5 函数 和首字母
'expr' => 'name',// 分表辅助表达式 可选 配合不同的分表规则
'num' => 'name',// 分表的数目 可选 实际分表的数量
);
获取当前的数据表不再使用getTableName方法,而是使用getPartitionTableName方法,而且必须传入当前的数据。然后根据数据分析应该实际操作哪个数据表。因此,分表的字段值必须存在于传入的数据中,否则会进行联合查询
网上摘抄的例子:
class MemberModel extends AdvModel {
protected $partition = array('field'=>'username','type'=>'id','num'=>'4');
public function getDao($data=array()) {
$data = empty($data) ? $_POST : $data;
$table = $this->getPartitionTableName($data);
return $this->table($table);
}
}
class MemberAction extends BaseAction {
public function login() {
if($this->isPost()) {
$this->validToken();
$dao = D('Member')->getDao();
$res = $dao->where('username = '.$_POST['username'])->find();
// output 为自定义方法
// $isAjax - bool
$this->output(false);
}
$this->display();
}
}
8,返回类型,设定查询数据的类型(默认是数组).