工学1号馆

home

« | 返回首页

ThinkPHP5.0快速入门--数据库(DataBase)

By Wu Yudong on November 13, 2017

TP5.0 的数据查询由低到高分三个层次:
1. 数据库原生查询(SQL查询);
2. 数据库链式查询(查询构造器);
3. 模型的对象化查询;

本文会涉及到前面两个,模型的查询会在以后的文章中进行讲解。在使用 Db 类进行数据库查询之前,首先必须先创建一个控制器类,以及一个操作方法用于测试。

如果你使用了多个模块,并且不同的模块采用不同的数据库连接,那么可以在每个模块的目录下面单独定义数据库配置。

原生查询

在开始之前,我们首先在数据库 demo 中创建一个 think_data 数据表(这里以 mysql 数据库为例),SQL代码如下:

CREATE TABLE IF NOT EXISTS `think_data`(
    `id` int(8) unsigned NOT NULL AUTO_INCREMENT,
    `name` varchar(255) NOT NULL COMMENT '名称',
    `status` tinyint(2) NOT NULL DEFAULT '0' COMMENT '状态',
    PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
INSERT INTO `think_data`(`id`,`name`,`status`) VALUES
(1,'thinkphp',1),
(2,'onethink',1),
(3,'topthink',1);

设置好数据库连接信息后,我们就可以直接进行原生的SQL查询操作了,包括 query execute 两个方法,分别用于查询和写入,下面我们来实现数据表 think_user 的CURD操作。

use think\Db;

class Index {
	public function index() {
		//创建
		//$result = Db::execute ( 'insert into think_data (id,name,status) values(5,"thinkphp",1)' );
		
		//更新
		//$result = Db::execute ('update think_data set name="framework" where id=5');
		
		//删除
		//$result = Db::execute ('delete from think_data where id = 5');
		
		//显示数据库列表
		//$result = Db::query ('show tables from demo');
		
		//清空数据表
		//$result = Db::execute ('TRUNCATE table think_data');
		
		dump ( $result );
	}
}

参数绑定

实际开发中,可能某些数据使用的是外部传入的变量,为了让查询操作更加安全,我们建议使用参数绑定机制,例如上面的操作可以改为:

class Index {
	public function index() {
		// Db::execute('insert into think_data(id,name,status)values(?,?,?)',[8,'wuyudong',1]);
		// $result=Db::query('select * from think_data where id = ?',[8]);
		
		// 或者使用命名占位符绑定
		Db::execute ( 'insert into think_data(id,name,status)values(:id,:name,:status)', [ 
				'id' => 6,
				'name' => 'wuyudong1',
				'status' => 1 
		] );
		$result = Db::query ( 'select * from think_data where id = :id', [ 
				'id' => 6 
		] );
		dump ( $result );
	}
}

查询构造器

除了原生查询外,5.0还提供了数据库查询构造器,可以更方便执行数据库操作,查询构造器基于PDO实现,对不同的数据库驱动都是统一的语法。

注意: ThinkPHP 5.0 查询构造器使用 PDO 参数绑定,以保护应用程序免于 SQL 注入,因此传入的参数不需额外转义特殊字符。

class Index {
	public function index() {
		//插入记录
		// $result = Db::table('think_data')->insert(['id'=>18, 'name'=>'wuyd','status'=>1]);
		
		//更新记录
		// $result = Db::table('think_data')->where('id',18)->update(['name'=>"hello"]);
		
		//查询数据
		// $result = Db::table('think_data')->where('id',18)->select();
		
		//删除数据
		// $result = Db::table('think_data')->where('id',18)->delete();
		dump ( $result );
	}
}

由于我们在数据库配置文件中设置了数据表的前缀为 think_ ,因此, table 方法可以改成 name 方法,这样就不会因为数据表前缀的修改而改动 CURD 代码,例如:

class Index {
	public function index() {
		//插入记录
		// $result = Db::name('data')->insert(['id'=>18, 'name'=>'wuyd','status'=>1]);
		
		//更新记录
		// $result = Db::name('data')->where('id',18)->update(['name'=>"hello"]);
		
		//查询数据
		// $result = Db::name('data')->where('id',18)->select();
		
		//删除数据
		 $result = Db::name('data')->where('id',18)->delete();
		dump ( $result );
	}
}

链式操作

使用链式操作可以完成复杂的数据库查询操作,例如:

class Index {
	public function index() {
		$list=Db::name('data')->where('status',1)->field('id,name')->order('id','desc')->limit(10)->select();
		dump ( $list );
	}
}

 事务支持

注意: 由于需要用到事务的功能,请先修改数据表的类型为 InnoDB ,而不是 MyISAM

对于事务的支持,最简单的方法就是使用 transaction 方法,只需要把需要执行的事务操作封装到闭包里面即可自动完成事务,例如:

Db::transaction(function () {
    Db::table('think_user')->delete(1);
    Db::table('think_data')->insert(['id' => 28, 'name' => 'thinkphp', 'status' => 1]);
});

一旦 think_data 表写入失败的话,系统会自动回滚,写入成功的话系统会自动提交当前事务。也可以手动控制事务的提交,上面的实现代码可以改成:

// 启动事务
Db::startTrans();
try {
    Db::table('think_user')->delete(1);
    Db::table('think_data')->insert(['id' => 28, 'name' => 'thinkphp', 'status' => 1]);
    // 提交事务
    Db::commit();
} catch (\Exception $e) {
    // 回滚事务
    Db::rollback();
}

注意:事务操作只对支持事务的数据库,并且设置了数据表为事务类型才有效,在Mysql数据库中请设置表类型为 InnoDB 。 并且事务操作必须使用同一个数据库连接。

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

Comments

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