一、什么是模型?
模型是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方法实例化自定义模型。