数据库操作

数据库配置

我们给应用定义数据库配置文件(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查询操作了,包括queryexecute两个方法,分别用于查询操作和写操作,下面我们来实现数据表think_dataCURD操作。

创建(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();
}
powered by GitbookEdit Time: 2023-04-08 10:28:32