模型类的命名以及和数据表的对应关系

在ThinkPHP默认的规则里面,模型类的命名是有必定的规则的,咱们来举一些简单的例子来讲明下。 
例如,在公司开始开发的时候在数据库里面建立了三个表,分别是:think_user、think_group和 think_group_user表。 
由于这三个表有着相同的前缀think_,所以咱们在项目配置文件里面定义数据表的前缀DB_PREFIX为think_。 
为了对user表和group表进行操做,咱们还须要给这些数据表定义模型,把对数据表的数据存取操做转换成数据对象的存取操做,若是按照ThinkPHP的惯例,模型类的命名能够定义以下:
  1. class UserModel extends Model{}
复制代码
UserModel对象就对应了数据表think_user的操做,咱们对think_user表的操做就体如今对UserModel对象的操做上面。 
例如:
  1. $User = new UserModel(); 
  2. $User->name = 'ThinkPHP'; 
  3. $User->email = '[email]liu21st@gmail.com[/email]'; 
  4. $User->add();
复制代码
上面的操做表示把一个用户数据插入think_user表里面。 
系统根据表前缀定义和UserModel这样的模型类的命名能够自动定位到要操做的数据表,而且在ThinkPHP里面全部的数据表名称都必须是小写,因此UserModel和userModel其实并无区别,首字母大写只是做为一个命名规范考虑。在ThinkPHP里面,类名和文件名对应也是一个规则,这样能够很方便地使用import导入类库。 
一样,其余两个表就对应了下面的模型类
  1. class GroupModel extends Model{} 
  2. class Group_UserModel extends Model{}
复制代码
但是咱们以为Group_UserModel的命名看得不太舒服(也许有人看的很舒服,呵呵~),因而就想能不能改为 GroupUserModel这样的命名呢,答案固然是确定的,并且不难作到。 
把类适当修改下,增长一个参数便可。
  1. class GroupUserModel extends Model{ 
  2. protected $tableName = 'group_user'; 
  3. }
复制代码
要注意的是,这里的tableName并非数据表的全名,真正的表名还要加上定义的前缀。 
项目作完了,公司以为要把全部数据表的前缀修改下,要求改为top_(公司的形象吧~) 
没有问题,如今咱们只须要修改项目配置文件里面的数据表的前缀DB_PREFIX定义,而后删除下项目编译缓存文件~app.php(注:项目配置文件是包含在项目编译缓存文件里面的,而且做为加载文件的返回值传给系统),Ok搞定。 
如今问题看起来解决了,因而开发好的网站上线了。但是忽然有一天,公司说要增长一个数据表ibm_score,用于和合做网站的接口,而且由于须要和外部接口表名没法更换(也许是其余缘由~) 
如今,咱们不得不使用另外的方法,其实也很容易解决,增长的模型类定义以下:
  1. class ScoreModel extends Model{ 
  2. protected $trueTableName = 'ibm_score'; 
  3. }
复制代码
trueTableName属性表示了模型对应的数据表的真名,而不会去理会什么表前缀了。 
看上去如今一切都平静了,网站无端障的运行了半年,但是公司业绩上去了,新来了一个技术总监,定义了一些新的规范,要把网站进行一些重构,其中包括了一项小小的要求,模型类命名里面的UserModel但愿改为User,这下让公司的技术人员有点为难,但是老大发话,谁敢不从呢。 
但是这个改动没有难倒公司的ThinkPHP技术人员,他们灵机一动,修改了一个配置参数就轻松搞定了,其效率让新来的技术总监颇为满意。 
他只是在项目配置文件里面增长了下面的参数定义 
  1. 'MODEL_CLASS_SUFFIX'=>''
复制代码

改完以后,他就按照技术总监的意思把全部的模型类命名和文件名都去掉了后面的Model,例如:
  1. class User extends Model{}

  2. class Group extends Model{} 

  3. class GroupUser extends Model{ protected $tableName = 'group_user';}
复制代码
而程序代码没有一行改动,并且他还自豪的告诉技术总监,若是他哪天想在模型类的前面增长一个前缀,他也能够经过增长 MODEL_CLASS_PREFIX 配置定义来实现。 
技术总监拍了拍这位技术人员的头,赞扬道:很好,很强大~ 

画外音:要作到模型类的命名规则的改变而不须要修改程序代码,固然是要使用内置的D方法,若是你使用了
  1. import('App.Model.UserModel'); 
  2. $User = new UserModel();
复制代码
这样的代码,那么若是UserModel被改为上面的User类了,这个代码就出错了 
而若是使用下面的方式
  1. $User = D("User");
复制代码
不管做何改变,依然能够运行,并且更加简洁不是么,呵呵~
相关文章
相关标签/搜索