例如,在公司开始开发的时候在数据库里面创建了三个表,分别是:think_user、think_group和 think_group_user表。
因为这三个表有着相同的前缀think_,因此我们在项目配置文件里面定义数据表的前缀DB_PREFIX为think_。
为了对user表和group表进行操作,我们还需要给这些数据表定义模型,把对数据表的数据存取操作转换成数据对象的存取操作,如果按照ThinkPHP的惯例,模型类的命名可以定义如下:
- class UserModel extends Model{}
例如:
- $User = new UserModel();
- $User->name = 'ThinkPHP';
- $User->email = '[email]liu21st@gmail.com[/email]';
- $User->add();
系统根据表前缀定义和UserModel这样的模型类的命名可以自动定位到要操作的数据表,并且在ThinkPHP里面所有的数据表名称都必须是小写,所以UserModel和userModel其实并没有区别,首字母大写只是作为一个命名规范考虑。在ThinkPHP里面,类名和文件名对应也是一个规则,这样可以很方便地使用import导入类库。
同样,其他两个表就对应了下面的模型类
- class GroupModel extends Model{}
- class Group_UserModel extends Model{}
把类适当修改下,增加一个参数即可。
- class GroupUserModel extends Model{
- protected $tableName = 'group_user';
- }
项目做完了,公司觉得要把所有数据表的前缀修改下,要求改成top_(公司的形象吧~)
没有问题,现在我们只需要修改项目配置文件里面的数据表的前缀DB_PREFIX定义,然后删除下项目编译缓存文件~app.php(注:项目配置文件是包含在项目编译缓存文件里面的,并且作为加载文件的返回值传给系统),Ok搞定。
现在问题看起来解决了,于是开发好的网站上线了。可是突然有一天,公司说要增加一个数据表ibm_score,用于和合作网站的接口,并且因为需要和外部接口表名无法更换(也许是其他原因~)
现在,我们不得不使用另外的方法,其实也很容易解决,增加的模型类定义如下:
- class ScoreModel extends Model{
- protected $trueTableName = 'ibm_score';
- }
看上去现在一切都平静了,网站无故障的运行了半年,可是公司业绩上去了,新来了一个技术总监,定义了一些新的规范,要把网站进行一些重构,其中包括了一项小小的要求,模型类命名里面的UserModel希望改成User,这下让公司的技术人员有点为难,可是老大发话,谁敢不从呢。
可是这个改动没有难倒公司的ThinkPHP技术人员,他们灵机一动,修改了一个配置参数就轻松搞定了,其效率让新来的技术总监颇为满意。
他只是在项目配置文件里面增加了下面的参数定义
- 'MODEL_CLASS_SUFFIX'=>''
改完之后,他就按照技术总监的意思把所有的模型类命名和文件名都去掉了后面的Model,例如:
- class User extends Model{}
- class Group extends Model{}
- class GroupUser extends Model{ protected $tableName = 'group_user';}
技术总监拍了拍这位技术人员的头,赞赏道:很好,很强大~
画外音:要做到模型类的命名规则的改变而不需要修改程序代码,当然是要使用内置的D方法,如果你使用了
- import('App.Model.UserModel');
- $User = new UserModel();
而如果使用下面的方式
- $User = D("User");