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

在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");
复制代码
无论作何改变,依然可以运行,而且更加简洁不是么,呵呵~

转载于:https://my.oschina.net/wxweven/blog/56344

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值