关于ThinkPHP中模型的创建和实例化操作

一、什么是模型?

模型是MVC三大组成部分的M(Model),作用是操纵数据,负责与数据表的数据交互(CURD)。

配置数据库连接:

在系统的主要配置文件中找到数据库的连接配置项:

将以上配置项复制粘贴到应用级别的配置文件当中,例如Admin/conf/config.php。

配置完成后创建数据库及数据表:

mysql> create database db_oa;
Query OK, 1 row affected (0.00 sec)

mysql> create table oa_dept(id int not null auto_increment,name varchar(50) not null,pid int not null default 0,sort int not null default 50,remark varchar(255),primary key(id)) engine=myisam default charset=utf8;
Query OK, 0 rows affected (0.30 sec)

模型的创建:

命名规范:模型名(要求是不带前缀的表名并且首字母要大写)+Model关键词+.class.php

代码结构规范:

第一步:声明命名空间;

第二步:引入父类模型;

第三步:声明模型并继承父类

例如:创建一个部门模型文件;

命名:DeptModel.class.php

<?php
//创建模型

//命名空间
namespace Admin\Model;
//引用父类模型
use Think\Model;
//声明模型并继承父类
class DeptModel extends Model{

}

注意:空模型也能进行数据表的基本操作(CURD),因为模型继承了父类,所以可执行基本的操作。

二、模型的实例化操作

因为模型本质是一个类,所以在使用模型的时候需要实例化。

普通实例化方法:

<?php
//命名空间
namespace Admin\Controller;
//引入父类控制器
use Think\Controller;
//声明控制器并且继承父类
class DeptController extends Controller{
	public function instantiation(){
		$model = new \Admin\Model\DeptModel();
		dump($model);
	} 
}

注意:$model = new \Admin\Model\DeptModel();因为DeptModel类并不在命名空间Admin\Controller下,所以要加上路径。

普通实例化结果:


快速实例化方法:

上述的普通实例化方法虽然可以进行实例化操作,但是使用上比较麻烦,还需要考虑    命名空间的限制,所以ThinkPHP为了简单、快速、高效的开发,为我们提供了两个快速方法可以对模型进行实例化操作:

D方法和M方法

D方法实例化:$obj = D(['模型名']);

表达的含义:实例化我们自己创建的模型(分组/Model目录中);如果传递了模型名,则实例化指定的模型,如果没有指定或者模型名不存在,则直接实例化父类模型(Model.class.php)。

M方法实例化:$obj = M(['不带前缀的表名']);

表达的含义:直接实例化父类模型(Think目录下的Model.class.php);如果指定了表名,则实例化父类模型的时候关联指定的表;如果没有指定表名(没有传递参数)则不关联表,一般用于执行原生的sql语句(M() -> query(原生的sql语句))


<?php
//命名空间
namespace Admin\Controller;
//引入父类控制器
use Think\Controller;
//声明控制器并且继承父类
class DeptController extends Controller{
	public function instantiation(){
		//$model = new \Admin\Model\DeptModel();
		//$model = D(['Dept']); 等价于new方法;
		//$model = D(); 实例化父类;
		//$model = M(['Dept']); 关联数据表;
		//$model = M(); 实例化父类,不关联数据表;
		dump($model);
	} 
}

经典面试题:

问:实例化方法中D方法和M方法有什么区别?

答:D方法是实例化自定义模型,如果自定义模型不存在,则实例化父类模型;M方法本身就是直接实例化父类模型。两者的差异就是实例化的对象不一样。

 

在后期开发的时候怎么去选择是使用D方法还是M方法呢?

答:可以根据自身的情况,如果需要使用的操作父类中已经封装好了,则可以直接实例化父类(使用M方法),如果父类中方法不能满足我们的开发需求,需要自己定义方法,则这个时候可以使用D方法实例化自定义模型。





猜你喜欢

转载自blog.csdn.net/qq_41630218/article/details/80920289