13.4 模型扩展

模型扩展目录位于Extend/Model下面,ThinkPHP本身提供了丰富的模型扩展,例如:
模型名 名称 说明
AdvModel 高级模型 扩展了文本字段、只读字段、序列化字段、延迟写入、乐观锁等高级特性
ViewModel 视图模型 扩展了模型的视图操作功能
RelationModel 关联模型 扩展了模型的关联操作
MongoModel Mongo模型 扩展了对Mongo数据库的数据操作支持
这些扩展模型都是基于系统的基础模型类Model扩展而来。

模型扩展接口

ThinkPHP的新版基础模型类Model具有很好的扩展性,对模型的CURD方法都提供了扩展接口,包含:
接口名称 所属方法 接口方法(参数)
初始化接口 全局 _initialize()
表达式过滤接口 全局 _options_filter(&$options)
写入前置接口 add方法 _before_insert(&$data,$options)
写入后置接口 add方法 _after_insert($data,$options)
更新前置接口 save方法 _before_update(&$data,$options)
更新后置接口 save方法 _after_update($data,$options)
数据写入接口 add、save方法 _facade($data)
数据库切换接口 db方法 _after_db()
删除后置接口 delete方法 _after_delete($data,$options)
查询后置接口 select方法 _after_select(&$result,$options)
查询后置接口 find方法 _after_find(&$result,$options)
目前提供的的扩展模型包括:高级模型(AdvModel)、视图模型(ViewModel)、关联模型(RelationModel)和Mongo模型都是继承Model类并且都通过了扩展完成了很多其他的功能。
不过在某些情况下,模型扩展并不一定要继承基础模型Model。

调用扩展模型

定义了模型扩展之后,有多种方式可以使用扩展模型:
一、继承扩展模型
最普遍的用法就是项目中的自定义模型或者公共模型直接继承扩展模型,例如:
我们需要使用Mongo模型的话,可以:Class UserModel extends MongoModel{}把原来的继承从Model类改为扩展模型MongoModel,就可以使用MongoModel的所有功能。
如果你的项目大部分模型都继承了一个公共的模型类CommonModel的话,只需要改下CommonModel的继承定义:Class CommonModel extends MongoModel{}所有继承自CommonModel的自定义模型也可以使用MongoModel的功能。
二、使用动态模型切换的方式
例如,我们定义了一个UserModel如下:Class UserModel extends Model{}为了使用AdvModel高级模型的功能,我们使用下面的方式切换到高级模型进行操作:$User->switchModel("Adv")->top10();注意:动态模型切换方法switchModel调用的时候无需写完整的扩展模型名称,需要去掉扩展模型的Model后缀后调用。
三、M方法实例化
如果我们没有定义自定义模型,则可以直接采用M方法实例化需要继承的扩展模型,例如:
M("AdvModel:User")->top10();
这里表示实例化User模型,而且该模型使用的基础模型类为AdvModel扩展模型类,这里引用的扩展模型需要使用全名。