ThinkPHP 5.1 记录(四) 数据库操作

官方说明:ThinkPHP内置了抽象数据库访问层,把不同的数据库操作封装起来,我们只需要使用公共的D...

官方说明:

ThinkPHP内置了抽象数据库访问层,把不同的数据库操作封装起来,我们只需要使用公共的Db类进行操作,而无需针对不同的数据库写不同的代码和底层实现,Db类会自动调用相应的数据库驱动来处理。数据库抽象访问层基于PDO方式,目前内置包含了Mysql、SqlServer、PgSQL、Sqlite等数据库的支持。


如果应用需要使用数据库,必须配置数据库连接信息,数据库的配置文件有多种定义方式。


image.png

	// 全局配置测试
	public function D1(){
		return Db::table('user')//查询user数据库
			->where('id=1')// id为1的数据
			->value('name');// 获取其name值
	}
	// 动态配置
	public function D2(){
		return Db::connect([
			'type'=>'mysql',
			'hostname'=>'127.0.0.1',
			'database'=>'tp51',
			'username'=>'root',
			'password'=>'root',
		])
			->table('user')
			->where('ID=1')
			->value('Password');
	}
	// DSN 连接
	public function D3(){
		$dsn = 'mysql://root:root@127.0.0.1:3306/tp51#utf8';
		return Db::connect($dsn)
			->table('user')
			->where('ID=1')
			->value('Level');
	}
	// 查询构造器
	// 数据库的增删改查工作

	// 单条查询
	public function find(){
		$res = Db::table('user')//选择数据表
			->where('ID','=',1)//查询表达式
			->find();//查询,返回一维数组
		dump(is_null($res) ? false : $res);
		// [ SQL ] SELECT * FROM `user` WHERE `ID` = 1 LIMIT 1 

		$res = Db::table('user')//选择数据表
			->field('ID,Password,Alias')// 仅获取指定字段
			->where('ID','=',1)//查询表达式
			->find();//查询,返回一维数组
		dump(is_null($res) ? false : $res);
		// [ SQL ] SELECT `ID`,`Password`,`Alias` FROM `user` WHERE `ID` = 1 LIMIT 1

		$res = Db::table('user')//选择数据表
			->field('ID,Password,Alias')// 仅获取指定字段
			// ->where('ID','=',1)//查询表达式
			->find(1);//使用主键查询,可以省略where
		dump(is_null($res) ? false : $res);
		// [ SQL ] SELECT `ID`,`Password`,`Alias` FROM `user` WHERE `ID` = 1 LIMIT 1

		// $res = Db::table('user')//选择数据表
		// 	->field(['ID'=>'12','Password'=>'密码','Alias'=>'别名'])// 仅获取指定字段
		// 	->where('ID','=',1)//查询表达式
		// 	->find();//查询,返回一维数组
		// dump(is_null($res) ? false : $res);
		// [ SQL ] SELECT `ID`,`Password`,`Alias` FROM `user` WHERE `ID` = 1 LIMIT 1
	}

	// 多条查询
	public function select(){
		// 返回的是一个二位数组,如果没有数据,则返回空数组
		$res = Db::table('user')
			->where([
				['ID','>',10],
				['ID','<',41],
			])
			->select();
		dump(empty($res) ? false : $res);
		// SELECT * FROM `user` WHERE `ID` > 0 AND `ID` < 4 [ RunTime:0.000414s ]
	}

	// 单条插入(新增)
	public function insert(){
		$data = [
			'Name'=>'t1',
			'Password'=>'22',
		];
		$res = Db::table('user')->insert($data);
		// [ SQL ] INSERT INTO `user` (`Name` , `Password`) VALUES ('t1' , '22')


		$res = Db::table('user')->insert($data,true);
		// 只有mysql可以传入true
		// [ SQL ] REPLACE INTO `user` (`Name` , `Password`) VALUES ('t1' , '22') 
		// replace into 跟 insert 功能类似,不同点在于:replace into 首先尝试插入数据到表中, 1. 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。 2. 否则,直接插入新数据。
		// 要注意的是:插入数据的表必须有主键或者是唯一索引!否则的话,replace into 会直接插入数据,这将导致表中出现重复的数据。


		$res = Db::table('user')->data($data)->insert();
		// 使用data方式对传入的参数进行过滤,这样会提高一定的安全性

		$res = Db::table('user')->insertGetId($data);
		// insertGetId()同时执行两步,先执行插件,然后返回主键ID,
		// insertGetId()必须传入参数,也就是说,不支持前置data语法

		// 成功返回1,
		dump($res);
	}

	// 多条插入
	public function insertAll(){
		$data = [
			['Name'=>'t2','Password'=>'2'],
			['Name'=>'t3','Password'=>'2'],
		];
		return Db::table('user')->insertAll($data);
		return Db::table('user')->insertAll($data,true);
		return Db::table('user')->data($data)->insertAll();
		// 返回插入的条数
		// [ SQL ] INSERT INTO `user` (`Name` , `Password`) VALUES ( 't2','2' ) , ( 't3','2' )
	}

	// 更新操作
	public function update(){
		// 必须有更新条件
		return Db::table('user')
			->where('ID','=','10')
			->update(['Name'=>'tt1']);//不支持data写法
		// 返回更新的条数
		// [ SQL ] UPDATE `user` SET `Name` = 'tt1' WHERE `ID` = 10 
	}

	// 删除操作
	public function delete(){
		return Db::table('user')->where('id','=','10')->delete();
		return Db::table('user')->delete('10');
	}

	// 原生SQL
	// 一般用于特殊语句

	// 原生查询
	public function query(){
		$sql = "SELECT * FROM user WHERE `Name`='test'";
		//$sql = "UPDATE `user` SET `Name` = 'ttt1' WHERE `ID` = 10 ";
		//$sql = "SELECT * FROM `user` WHERE `ID` = 1 LIMIT 1 ";
		dump(DB::query($sql));
		// 字段必须用 ` 而不能用引号
	}
	// 原生写操作
	public function execute(){
		$sql = "UPDATE `user` SET `Name` = 'tt1' WHERE `ID` = 10 ";
		dump(DB::execute($sql));
		// 字段必须用 ` 而不能用引号
	}


评论