学习要点:

1.创建数据库

2.实例化模型

3.字段定义

本节课,我们重点了解一下

本节课,我们重点了解一下 ThinkPHP 模型操作部分。模型是 MVC 中的 M,可以理解

为操作数据库部分操作。

一.创建数据库

在使用模型操作之前,我们首先创建一个数据库:thinkphp。创建一个用户表:user。

添加一些数据即可。

ThinkPHP内置了抽象数据库访问层,把不同的数据库操作封装起来。我们只需要使用

公共的Db类进行操作,无须针对不同的数据库写不同的代码和底层实现。Db类会自动调用

相应的数据库驱动来处理。

目前支持的数据库包括Mysql(包含mysql和mysqli)、SqlServer、PgSQL、Sqlite、

Oracle、Ibase、Mongo、PDO等。

支持的数据库设置


DB_TYPE设置

   

支持的数据库类型

   

mysql或mysqli

mysql

pgsql 

pgsql

sqlite 

sqlite

mssql或sqlsrv

sqlserver

oracle

oracle

ibase

ibase

mongo

mongo

PDO

PDO支持的所有数据库

   


//全局配置定义


'DB_TYPE'=>'mysql',

   

//数据库类型

   



'DB_HOST'=>'localhost',

   

//服务器地址

   



'DB_NAME'=>'thinkphp',

   

//数据库名

   



'DB_USER'=>'root',

   

//用户名

   



'DB_PWD'=>'123456',

   

//密码

   



'DB_PORT'=>3306,

   

//端口

   



'DB_PREFIX'=>'think_',

   

//数据库表前缀

   


PS:数据库全局配置信息除了PDO,均可以采用上面的设置。

//PDO专用定义

        'DB_TYPE'=>'pdo',        //数据库类型

'DB_USER'=>'root', //用户名 'DB_PWD'=>'123456', //密码

        'DB_PREFIX'=>'think_',   //数据库表前缀

'DB_DSN'=>'mysql:host=localhost;dbname=thinkphp;charset=UTF8',

二.实例化模型

连接上数据库后,我们需要从数据库里操作数据,那么就需要实例化模型类。在 ThinkPHP中,提供了Model基类处理,也可以使用M()方法。

//实例化Model类,传一个数据表名

$user = new Model('User');

//显示变量结构

var_dump($user);

Model基类可以传递三个参数:

Model(['模型名'],['数据表前缀'],['数据库连接信息']);

//实例化Model类,改变表前缀

$user = new Model('User','tp_');

//实例化Model类,定义数据库链接信息

$user =

new Model('User','think_','mysql://root:123456@localhost/thinkphp');

//打印出所有数据

var_dump($user->select());

使用Model基类还需要导入命名空间,而使用M()方法,则不需要。

//实例化Model类 $user = M('User');

除了使用Model基类和M()方法,还有一种对应数据表的模型定义,比如:UserModel。这种模型类并非必须定义的,只有当存在独立的业务逻辑或者属性的时候才需要。

//User模型类

namespace Home\Model; use Think\Model; class UserModel extends Model {}

创建了UserModel模型类后,控制器那头就可以直接声明。

//User模型类

$user = new UserModel(); var_dump($user->select()); 为什么UserModel模型类没有指定任何表即可直接访问呢?因为这种模型类基本是直

接操作数据表的,所以在命名规范上和数据表名是对应的。

模型类与数据表对应规范


模型名

   

对应的数据表(假设前缀是think_)

   



UserModel

   

think_user

   



UserTypeModel

   

think_user_type

   


虽然使用模型类和数据表对应较为方便,但当有时我们需要更换表名、前缀、附加数据

库名等,就需要一些字段定义的操作。为了更加方便的了解数据表的变化,我们使用一下页

面Trace工具,可以时时的查询SQL的变化。

//页面Trace,调试辅助工具

'SHOW_PAGE_TRACE' =>true,

数据表定义


字段属性

   

说明

   



tablePrefix

   

定义模型对应数据表的前缀

   



tableName

   

不包含表前缀的数据表名称

   



trueTableName

   

包含表前缀的数据表名称

   



dbName

   

定义模型当前对应的数据库名称

   


//重新定义表前缀

class UserModel extends Model { protected $tablePrefix = 'abc_';

}

//重新定义表名

class UserModel extends Model { protected $tableName = 'abc';

}

//重新定义完整的带前缀的表名

class UserModel extends Model { protected $trueTableName = 'tp_abc';

}

//附加数据库名

class UserModel extends Model { protected $dbName = 'tp';

}

如果你仅仅使用CURD等数据库基本操作,我们建议使用基于Model基类的M()方法。使用M()方法由于不需要加载具体的模型类(比如UserModel类),所以性能会更高。

当然,如果有必要使用具体的模型类时,ThinkPHP还提供了D()方法来直接是实例化

模型类,并且还可以免去引入命名空间等操作。

//实例化UserModel类

$user = D('User');

PS:使用D()方法比直接使用模型类更加的智能,如果在\Home\Model\UserModel找

不到该模型类,那么就会去公共模块下找\Common\Model\UserModel去找。如果还找不到,

就会直接实例化基类Model()类,也就是等同于使用M()方法。

D()方法可以直接调用当前模块的模型类,那么如果跨模块调用的话,那怎么处理呢?

比如Admin后台模块,可以使用目录声明。

//跨模块实例化

$user = D('Admin/User');

有时,你可能想使用原生的SQL语句进行操作数据库。那么可以采用实例化空模型基

类或者空M()方法。

//空M()方法

$user = M();                       

//或者new Model();空基类

var_dump($user->query("SELECT * FROM think_user WHERE user='蜡笔小新

'"));

三.字段定义

每个模型类操作着每个对应的数据表,在大多数情况下,系统会自动获取当前数据表的

字段信息。而当模型类第一次实例化时,系统会自动缓存字段,并且永久缓存,除非删除了

运行时缓存或者设置不缓存。

如果调试模式下,则不会生成字段缓存文件,每次都是从数据表里重新获取。生成缓存

的目的显而易见,就是为了快速响应。ThinkPHP 默认是开启字段缓存,因为在实际运行中,

不会更改字段结构。

字段缓存文件保存在 Runtime/Data/_fields/目录里,当你在开发阶段,字段和表会经常

变动,所以要关闭缓存。关闭缓存的方法为:

// 关闭字段缓存

        'DB_FIELDS_CACHE'=>false               //开启了调试模式,自动关闭

PS:如果开启缓存状态,新增了字段,那么可能新字段无法刷新出来,必须删除

/Data/_fields 文件夹,重新获取字段。

//查看字段结构

var_dump($user->getDbFields());

你也可以使用手动定义数据表字段的方式取代字段缓存方式,这种方式可以提高性能,

避免IO开销。

//手动定义数据表字段,_pk表示主键

class UserModel extends Model { protected $fields = array('id', 'user', '_pk'=>'id');

}

//type定义每个字段的类型,可以永远字段验证

class UserModel extends Model { protected $fields = array('id', 'user', '_pk'=>'id',

'type'=>array('id'=>'smallint','user'=>'varchar'));

}


关注极客云图了解更多内容