工学1号馆

home

« | 返回首页 | »

ThinkPHP模型初步

By Wu Yudong on September 26, 2017

一.创建数据库
在使用模型操作之前,我们首先创建一个数据库:
thinkphp。创建一个用户表:user。添加一些数据即可。
ThinkPHP 内置了抽象数据库访问层,把不同的数据库操作封装起来。我们只需要使用公共的 Db 类进行操作,无须针对不同的数据库写不同的代码和底层实现。Db 类会自动调用相应的数据库驱动来处理。
目前支持的数据库包括
Mysql(包含 mysql mysqli)SqlServerPgSQLSqliteOracleIbaseMongoPDO 等。

	// mysql全局配置定义
	'DB_TYPE'=>'mysql',        //数据库类型
	'DB_HOST'=>'localhost',    //服务器地址
	'DB_USER'=>'root',         //数据库名
	'DB_PWD'=>'',           //密码
	'DB_NAME'=>'thinkphp',     //数据库名
	'DB_PORT'=>3306,           //端口
	'DB_PREFIX'=>'think_',     //数据库表前缀

二.实例化模型

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

	public function model() {
		// 创建Model基类,传递User表,think_user
		$user = new Model( 'User' );
		var_dump ($user->select()); //显示变量结构 
	}

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

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

实战一下:

在/Home/Controller/下新建 UserController.class.php

<?php

namespace Home\Model;

use Think\Model;

class UserModel extends Model {

}

这时候可以使用UserModel取代M或者Model:

	public function model() {
		$user = new UserModel( 'User' );
		var_dump ($user->select());
	}

如果你仅仅使用 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='蜡笔小新'"));

D()方法可以直接调用当前模块的模型类,那么如果跨模块调用的话,那怎么处理呢?比如 Admin 后台模块,可以使用目录声明。
//跨模块实例化
$user = D('Admin/User');

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

//M()方法
$user = M(); //或者new Model();空基类
var_dump($user->query("SELECT * FROM think_user WHERE user='wuyudong'"));

三.字段定义

每个模型类操作着每个对应的数据表,在大多数情况下,系统会自动获取当前数据表的字段信息。而当模型类第一次实例化时,系统会自动缓存字段,并且永久缓存,除非删除了运行时缓存或者设置不缓存。
如果调试模式下,则不会生成字段缓存文件,每次都是从数据表里重新获取。生成缓存的目的显而易见,就是为了快速响应。
ThinkPHP 默认是开启字段缓存,因为在实际运行中,不会更改字段结构。
字段缓存文件保存在
Runtime/Data/_fields/目录里,当你在开发阶段,字段和表会经常变动,所以要关闭缓存。关闭缓存的方法为:

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

PS:如果开启缓存状态,新增了字段,那么可能新字段无法刷新出来,必须删除/Data/_fields 文件夹,重新获取字段。

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

//手动定义数据表字段,_pk表示主键
class UserModel extends Model {
       protected $fields = array('id', 'user', '_pk'=>'id');
}

如果文章对您有帮助,欢迎点击下方按钮打赏作者

Comments

No comments yet.
To verify that you are human, please fill in "七"(required)