一、前言
这两天因为工作需要就学了个ThinkPHP框架,感觉还挺好,之前一直是用Java来开发网站,一下子使用另外一门语言刚开始也是有点不习惯,但是每种语言都是可以触类旁通的,所以学起来就没有那么吃力,然后想通过写写博客来巩固一下这几天的学习成果。我是按照ThinkPHP的开发手册来学习这个框架的,所以接下来我也是会按照开发手册加上一些代码来介绍Think PHP框架的一些实现。
二、模型
什么是模型?
在ThinkPHP中基础的模型类就是Think\Model类,该类完成了基本的CURD、ActiveRecord模式、连贯操作和统计查询,一些高级特性被封装到另外的模型扩展中。基础模型类的设计非常灵活,甚至可以无需进行任何模型定义,就可以进行相关数据表的ORM和CURD操作,只有在需要封装单独的业务逻辑的时候,模型类才是必须被定义的。
模型定义
【1】模型类通常需要继承系统的\Think\Model类或其子类,下面是一个Home\Model\UserModel类的定义:
namespace Home\Model;
use Think\Model;
class UserModel extends Model {
//可以什么都不写
}
注意:模型类的作用大多数情况是操作数据表的,如果按照系统的规范来命名模型类的话,大多数情况下是可以自动对应数据表。
【2】模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写,然后加上模型层的名称(默认定义是Model),例如:
namespace Home\Model;
use Think\Model;
class UserModel extends Model {
//UserModel 约定对应数据表think_user。(假设数据库的前缀定义是 think_)
}
//===========================================================================
namespace Home\Model;
use Think\Model;
class UserTypeModel extends Model {
//UserTypeModel 约定对应数据表think_user_type。(假设数据库的前缀定义是 think_)
}
【3】在ThinkPHP的模型里面,有几个关于数据表名称的属性定义:
属性 | 说明 |
---|---|
tablePrefix | 定义模型对应数据表的前缀,如果未定义则获取配置文件中的DB_PREFIX参数 |
tableName | 不包含表前缀的数据表名称,一般情况下默认和模型名称相同,只有当你的表名和当前的模型类的名称不同的时候才需要定义。 |
trueTableName | 包含前缀的数据表名称,也就是数据库中的实际表名,该名称无需设置,只有当上面的规则都不适用的情况或者特殊情况下才需要设置。 |
下面是例子:
<?php
namespace Home\Model;
use Think\Model;
/**
* @author czd <[email address]>
*/
class UserModel extends Model
{
//如果表名称是Users,则可以根据这个tableName设置对应表与模型的映射
protected $tableName = 'user';
/**
* 如果表的前缀是top_,则可以根据tablePrefix设置对应表与模型的映射;
* 如果数据表直接就是user,而没有前缀,则可以设置tablePrefix为空字符串。
*/
protected $tablePrefix = 'think_';
/**
*而对于另外一种特殊情况,我们需要操作的数据表是top_categories,这个时候我们就需要定义 trueTableName 属性
* 注意trueTableName需要完整的表名定义。
*/
protected $trueTableName = 'think_user';
//
/**
* 如果不希望依赖字段缓存或者想提高性能,也可以在模型类里面手动定义数据表字段的名称,可以避免IO加载的效率开销,
* 除了可以设置数据表的字段之外,我们还可以定义字段的类型,用于某些验证环节
* @var array
*/
protected $fields = array('id', 'name', 'age', 'sex','_pk'=>'id',
'_type'=>array('id'=>'int','name'=>'varchar','age'=>'int','sex'=>'char')
);
/**
* 字段映射:字段映射功能可以让你在表单中隐藏真正的数据表字段,而不用担心放弃自动创建表单对象的功能
*/
protected $_map = array(
'ids' =>'id',
'userName' => 'name', // 把表单中userName映射到数据表的name字段
'userAge' => 'age', // 把表单中userAge映射到数据表的age字段
'userSex' => 'sex' // 把表单中userSex映射到数据表的sex字段
);
}
三、总结
多敲,多看,多实战,就好了。