13.4 模型扩展
匿名 · 更新于 2013/12/26
模型扩展目录位于Extend/Model下面,ThinkPHP本身提供了丰富的模型扩展,例如:
这些扩展模型都是基于系统的基础模型类Model扩展而来。
| 模型名 | 名称 | 说明 |
|---|---|---|
| AdvModel | 高级模型 | 扩展了文本字段、只读字段、序列化字段、延迟写入、乐观锁等高级特性 |
| ViewModel | 视图模型 | 扩展了模型的视图操作功能 |
| RelationModel | 关联模型 | 扩展了模型的关联操作 |
| MongoModel | Mongo模型 | 扩展了对Mongo数据库的数据操作支持 |
模型扩展接口
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) |
不过在某些情况下,模型扩展并不一定要继承基础模型Model。
调用扩展模型
定义了模型扩展之后,有多种方式可以使用扩展模型:一、继承扩展模型
最普遍的用法就是项目中的自定义模型或者公共模型直接继承扩展模型,例如:
我们需要使用Mongo模型的话,可以:
Class UserModel extends MongoModel{}
如果你的项目大部分模型都继承了一个公共的模型类CommonModel的话,只需要改下CommonModel的继承定义:
Class CommonModel extends MongoModel{}
二、使用动态模型切换的方式
例如,我们定义了一个UserModel如下:
例如,我们定义了一个UserModel如下:
Class UserModel extends Model{}
$User->switchModel("Adv")->top10();
三、M方法实例化
如果我们没有定义自定义模型,则可以直接采用M方法实例化需要继承的扩展模型,例如:
M("AdvModel:User")->top10();
这里表示实例化User模型,而且该模型使用的基础模型类为AdvModel扩展模型类,这里引用的扩展模型需要使用全名。
如果我们没有定义自定义模型,则可以直接采用M方法实例化需要继承的扩展模型,例如:
M("AdvModel:User")->top10();
这里表示实例化User模型,而且该模型使用的基础模型类为AdvModel扩展模型类,这里引用的扩展模型需要使用全名。
