数据库操作
数据库配置
我们给应用定义数据库配置文件(appliation/database.php
),里面设置了应用的全局数据库配置信息。
return [
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => '127.0.0.1',
// 数据库名
'database' => 'test',
// 数据库用户名
'username' => 'root',
// 数据库密码
'password' => '',
// 数据库连接端口
'hostport' => '',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => '',
// 数据库调试模式
'debug' => true,
];
配置长链接
return [
// 数据库名
'database' => 'demo',
// 数据库表前缀
'prefix' => 'think_',
// 数据库连接参数
'params' => [
// 使用长连接
\PDO::ATTR_PERSISTENT => true,
],
];
原生查询
设置好数据库连接信息后,我们就可以直接进行原生的SQL查询操作了,包括query
和execute
两个方法,分别用于查询操作和写操作,下面我们来实现数据表think_data
的CURD
操作。
创建(create)
// 插入记录
$result = Db::execute('insert into think_data (id, name ,status) values (5, "thinkphp",1)');
dump($result);
更新(update)
// 更新记录
$result = Db::execute('update think_data set name = "framework" where id = 5 ');
dump($result);
读取(read)
// 查询数据
$result = Db::query('select * from think_data where id = 5');
dump($result);
删除(delete)
// 删除数据
$result = Db::execute('delete from think_data where id = 5 ');
dump($result);
其它操作
可以执行一些其他的数据库操作,原则上,读操作都使用query
方法,写操作使用execute
方法即可,例如:
// 显示数据库列表
$result = Db::query('show tables from demo');
dump($result);
// 清空数据表
$result = Db::execute('TRUNCATE table think_data');
dump($result);
查询构造器
除了原生查询外,5.0还提供了数据库查询构造器,可以更方便执行数据库操作,查询构造器基于PDO实现,对不同的数据库驱动都是统一的语法。
// 插入记录
Db::table('think_data')
->insert(['id' => 18, 'name' => 'thinkphp', 'status' => 1]);
// 更新记录
Db::table('think_data')
->where('id', 18)
->update(['name' => "hello"]);
// 查询数据
$list = Db::table('think_data')
->field('name,email')
->where('id', 18)
->select();
// 删除数据
Db::table('think_data')
->where('id', 18)
->delete();
由于我们在数据库配置文件中设置了数据表的前缀为think_
,因此,table
方法可以改成name
方法,这样就不会因为数据表前缀的修改而改动CURD
代码,例如:
// 插入记录
Db::name('data')
->insert(['id' => 18, 'name' => 'thinkphp']);
// 更新记录
Db::name('data')
->where('id', 18)
->update(['name' => "framework"]);
// 查询数据
$list = Db::name('data')
->where('id', 18)
->select();
dump($list);
// 删除数据
Db::name('data')
->where('id', 18)
->delete();
如果使用系统提供的助手函数db
则可以进一步简化查询代码如下:
$db = db('data');
// 插入记录
$db->insert(['id' => 20, 'name' => 'thinkphp']);
// 更新记录
$db->where('id', 20)->update(['name' => "framework"]);
// 查询数据
$list = $db->where('id', 20)->select();
dump($list);
// 删除数据
$db->where('id', 20)->delete();
链式操作
使用链式操作可以完成复杂的数据库查询操作,例如:
// 查询十个满足条件的数据 并按照id倒序排列
$list = Db::name('data')
->where('status', 1)
->field('id,name')
->order('id', 'desc')
->limit(10)
->select();
dump($list);
链式操作不分先后,只要在查询方法(这里是select
方法)之前调用就行,所以,下面的查询是等效的:
// 查询十个满足条件的数据 并按照id倒序排列
$list = Db::name('data')
->field('id,name')
->order('id', 'desc')
->where('status', 1)
->limit(10)
->select();
dump($list);
支持链式操作的查询方法包括:
方法名 | 描述 |
---|---|
select | 查询数据集 |
find | 查询单个记录 |
insert | 插入记录 |
update | 更新记录 |
delete | 删除记录 |
value | 查询值 |
column | 查询列 |
chunk | 分块查询 |
count等 | 聚合查询 |
事务支持
对于事务的支持,最简单的方法就是使用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();
}