实例化模型
在ThinkPHP2.0及以上版本中,可以无需进行任何模型定义。只有在需要封装单独的业务逻辑时,模型类才是必须定义的,因此ThinkPHP在模型上有很多灵活性和方便性,而不必因为表太多而烦恼
ThinkPHP有几种实例化模型的方法
1、实例化基础模型类
即实例化系统自带的Model类,ThinkPHP会自动帮我们找到数据库中相应的表,并获取其字段(表结构信息)
$User=new Model('User');
$User=M('User');(快捷方法,通过M()函数)
大写字母与下划线关系(think_是在配置文件中设置的表前缀)
实例化基础模型类传递进去的参数 在数据库中对应的表名
User think_user
UserMessage think_user_message
ps,因为表前缀中已经有了一个下划线,所以user对应的也是think_user
2、实例化其它模型类
第一种实例化方法因为没有涉及自定义模型类,因此很难封装一些自定义的业务逻辑(因为ThinkPHP自带的基础模型类显然只提供了基本的CRUD操作等等一些操作,肯定是无法满足项目业务逻辑的,所以必须自定义模型类来封装自定义业务逻辑),如果只需要扩展一些通用的(所谓通用,就是多个针对不同表的模型类都需要用到的逻辑)自定义业务逻辑,那么可以采用这种方式
$User=new CommonModel('User');
$User=M('User','CommonModel');(快捷方式,通过M()函数)
ps,CommonModel类是一个自定义模型类,在应用目录->Lib目录->Model目录->CommonModel.class.php文件中
因为ThinkPHP是自动加载模型类的,所以在实例化模型类之前不需要手动模型类文件的导入,即不需要require '模型类文件';等
自定义模型类必须继承系统自带的模型类(比如说Model类),而且没有别名导入的话,自定义模型类文件必须放在应用目录->Lib目录->Model目录下
可以在CommonModel类里面定义一些通用的逻辑方法,就可以省去为每个数据表定义具体的模型类,如果你的项目已经有超过100个数据表了,而大多数情况都是一些基本的CURD操作的话,只是个别模型有一些复杂的业务逻辑需要封装,那么第一种方式和第二种方式的结合是一个不错的选择。
3、实例化自定义模型类
得先定义针对不同表的自定义模型类,比如说UserModel类,UserMessagesModel类等等,然后再进行实例化。这种方式是用的最多的
$User=new UserModel;
$User=D('User');(快捷方式,通过D()函数),D()函数有自动检测自定义模型类的功能,如果应用目录->Lib目录->Model目录下存在所传入参数对应的自定义模型类(即参数User对应于自定义模型类UserModel),那么就会实例化该自定义模型类,否则则实例话系统自带的模型类(Model类)。而且对于已经实例化过的模型不会重复实例化,默认的D()函数只能实例化当前应用的模型类,不能跨应用实例化模型类,如果想实例化其它应用的模型类,则可以$User=D('User','其它应用名');,如果启用了模块分组,则可以$Usr=D('其它分组名.User');
ps,这种实例化模型方式与上一种方式有何区别,其实上一种方式最大的特征就是通用。对于一张表,如果你只想对其进行简单的CRUD操作,则采用第一种方式即可;如果你不仅想对其进行简单的CRUD操作,还想用到一些该项目其它表通用的自定义逻辑操作,则采用第二种方式;如果不仅想对其进行CRUD操作,还想用到一些自定义的逻辑操作,而且这些逻辑操作只有该表用到(即不需要用到其它表通用的自定义逻辑操作),则采用第三种方式
4、实例化一个空模型类
如果仅仅是想使用原生SQL的话,不需要使用额外的模型类,可以选择实例化一个空模型类
$Model=new Model();
$Model=M();(快捷方式,通过M()函数)
比如说$Model->query('SELECT * FROM think_user where status=1');
不管是采用哪一种方式,以及不管是采用new、M()或者D()进行实例化模型类,都会ThinkPHP都会自动加载数据库连接信息去连接数据库,如果数据库连接失败也是会报错的