模型扩展 高级模型


高级模型
 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,返回类型,设定查询数据的类型(默认是数组).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值