php

thinkphp实例化模型、模型命名和获取字段

2023-10-09

实例化模型

  在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都会自动加载数据库连接信息去连接数据库,如果数据库连接失败也是会报错的