ThinkPHP6 连接使用数据库,增删改查,find,select,save,insert,insertAll,insertGetId,delete,update方法的用法

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介: 本文介绍了在ThinkPHP6框架中如何连接和使用数据库进行增删改查操作。内容包括配置数据库连接信息、使用Db类进行原生MySQL查询、find方法查询单个数据、select方法查询数据集、save方法添加数据、insertAll方法批量添加数据、insertGetId方法添加数据并返回自增主键、delete方法删除数据和update方法更新数据。此外,还说明了如何通过数据库配置文件进行数据库连接信息的配置,并强调了在使用Db类时需要先将其引入。

ThinkPHP6 连接使用数据库

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

配置文件 database.php

在全局或者应用配置目录(config)下面的database.php中(后面统称为数据库配置文件)配置下面的数据库参数:

return [
    'default'    =>    'mysql',
    'connections'    =>    [
        'mysql'    =>    [
            // 数据库类型
            'type'        => 'mysql',
            // 服务器地址
            'hostname'    => '127.0.0.1',
            // 数据库名
            'database'    => 'thinkphp',
            // 数据库用户名
            'username'    => 'root',
            // 数据库密码
            'password'    => '',
            // 数据库连接端口
            'hostport'    => '',
            // 数据库连接参数
            'params'      => [],
            // 数据库编码默认采用utf8
            'charset'     => 'utf8',
            // 数据库表前缀
            'prefix'      => 'think_',
        ],
    ],
];

在这里插入图片描述

新版采用多类型的方式配置,方便切换数据库。

default配置用于设置默认使用的数据库连接配置。
connections配置具体的数据库连接信息,default配置参数定义的连接配置必须要存在。

type参数用于指定数据库类型

type 数据库
mysql MySQL
sqlite SqLite
pgsql PostgreSQL
sqlsrv SqlServer
mongo MongoDb
oracle Oracle

每个应用可以设置独立的数据库连接参数,通常直接更改default参数即可:

return [
    'default'    =>    'admin', 
];

切换连接 Db::connect

我们可以在数据库配置文件中定义多个连接信息

return [
    'default'    =>    'mysql',
    'connections'    =>    [
        'mysql'    =>    [
            // 数据库类型
            'type'        => 'mysql',
            // 服务器地址
            'hostname'    => '127.0.0.1',
            // 数据库名
            'database'    => 'thinkphp',
            // 数据库用户名
            'username'    => 'root',
            // 数据库密码
            'password'    => '',
            // 数据库连接端口
            'hostport'    => '',
            // 数据库连接参数
            'params'      => [],
            // 数据库编码默认采用utf8
            'charset'     => 'utf8',
            // 数据库表前缀
            'prefix'      => 'think_',
        ],
        'demo'    =>    [
            // 数据库类型
            'type'        => 'mysql',
            // 服务器地址
            'hostname'    => '127.0.0.1',
            // 数据库名
            'database'    => 'demo',
            // 数据库用户名
            'username'    => 'root',
            // 数据库密码
            'password'    => '',
            // 数据库连接端口
            'hostport'    => '',
            // 数据库连接参数
            'params'      => [],
            // 数据库编码默认采用utf8
            'charset'     => 'utf8',
            // 数据库表前缀
            'prefix'      => 'think_',
        ],
    ],
];

我们可以调用Db::connect方法动态配置数据库连接信息,例如:

\think\facade\Db::connect('demo')
    ->table('user')
    ->find();

connect方法必须在查询的最开始调用,而且必须紧跟着调用查询方法,否则可能会导致部分查询失效或者依然使用默认的数据库连接。

动态连接数据库的connect方法仅对当次查询有效。

这种方式的动态连接和切换数据库比较方便,经常用于多数据库连接的应用需求。

在tp6中使用原生的Mysql-小例子

原生的Mysql就是query方法和excute方法。

query方法用来执行MySql的查询操作

public function index(){
   
    $query = Db::query("select * from `book`");
    // 输出查询出的结果集数组
    dump($query);
}

execute方法用来执行MySql新增和修改的操作

public function index(){
   
    $execute = Db::execute("insert into `book` values(0,'大话数据结构','40','大牛')");
    // 输出查询出的结果集数组
    dump($execute);
}

示例:查询某张表所有信息并且返回

简单起见,我们直接在控制器中调用一下查询语句,然后将结果返回为字符串来查看。

在这里插入图片描述

首先,配置config/database.php数据库配置文件

<?php

return [
    // 默认使用的数据库连接配置
    'default'         => env('database.driver', 'mysql'),

    // 自定义时间查询规则
    'time_query_rule' => [],

    // 自动写入时间戳字段
    // true为自动识别类型 false关闭
    // 字符串则明确指定时间字段类型 支持 int timestamp datetime date
    'auto_timestamp'  => true,

    // 时间字段取出后的默认时间格式
    'datetime_format' => 'Y-m-d H:i:s',

    // 时间字段配置 配置格式:create_time,update_time
    'datetime_field'  => '',

    // 数据库连接配置信息
    'connections'     => [
        'mysql' => [
            // 数据库类型
            'type'            => env('database.type', 'mysql'),
            // 服务器地址
            'hostname'        => env('database.hostname', '127.0.0.1'),
            // 数据库名 自己的
            'database'        => env('database.database', 'phpdemo'),
            // 用户名
            'username'        => env('database.username', 'root'),
            // 密码 自己的密码
            'password'        => env('database.password', 'root'),
            // 端口
            'hostport'        => env('database.hostport', '3306'),
            // 数据库连接参数
            'params'          => [],
            // 数据库编码默认采用utf8
            'charset'         => env('database.charset', 'utf8'),
            // 数据库表前缀
            'prefix'          => env('database.prefix', ''),

            // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
            'deploy'          => 0,
            // 数据库读写是否分离 主从式有效
            'rw_separate'     => false,
            // 读写分离后 主服务器数量
            'master_num'      => 1,
            // 指定从服务器序号
            'slave_no'        => '',
            // 是否严格检查字段是否存在
            'fields_strict'   => true,
            // 是否需要断线重连
            'break_reconnect' => false,
            // 监听SQL
            'trigger_sql'     => env('app_debug', true),
            // 开启字段缓存
            'fields_cache'    => false,
        ],

        // 更多的数据库配置信息
    ],
];

然后对控制器进行配置:

<?php
namespace app\controller;

use app\BaseController;
use think\facade\View; // 使用模板引擎
use think\facade\Db; // 使用Db数据

class Index extends BaseController
{
   
    public function index()
    {
   
        $query = Db::query('select * from book');
        dump($query) ;
    }

}

需要注意的是,要想操作数据库,必须将对应的类导入进来use think\facade\Db,这里的dump()函数其实和var_dump()几乎一样,输出数据类型,数据长度及内容。

在这里插入图片描述

当然,我们也可以将数据之间返回到前端页面,并且渲染出来

将控制器代码修改如下:

<?php
namespace app\controller;

use app\BaseController;
use think\facade\View; // 使用模板引擎
use think\facade\Db; // 使用Db数据

class Index extends BaseController
{
   
    public function index()
    {
   
        $query = Db::query('select * from book');
        view::assign('books',$query);
        return view::fetch();
    }

}

添加视图层 view/index/index.html

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <table>
        <tr>
            <td>id</td>
            <td>书名</td>
            <td>价格</td>
            <td>作者</td>
        </tr>
        {foreach $books as $key=>$book}
        <tr>
            <td>{$book['id']}</td>
            <td>{$book['bookName']}</td>
            <td>{$book['bookPrice']}</td>
            <td>{$book['author']}</td>
        </tr>
        {/foreach}
    </table>
</body>
</html>

访问测试渲染是否成功:

在这里插入图片描述

使用框架提供的MySql

ThinkPHP6 提供了一个很丰富的查询构造器它包含以下内容

查询数据,添加数据,更新数据,删除数据,查询表达式,链式操作,聚合查询,分页查询,时间查询,高级查询,视图查询,JSON字段,子查询,原生查询,获取查询参数。

只记录下最简单的crud操作…

1. 查询数据 find select

1.1 查询单个数据 find

查询单个数据使用find方法:

// table方法必须指定完整的数据表名
Db::table('think_user')->where('id', 1)->find();

最终生成的SQL语句是:

SELECT * FROM `think_user` WHERE  `id` = 1 LIMIT 1

find方法查询结果不存在,返回 null,否则返回结果数组

1.2 查询数据集 select

查询多个数据(数据集)使用select方法:

Db::table('think_user')->where('status', 1)->select();

最终生成的SQL语句是:

SELECT * FROM `think_user` WHERE `status` = 1

select 方法查询结果是一个数据集对象,如果需要转换为数组可以使用

Db::table('think_user')->where('status', 1)->select()->toArray();

tp6提供的框架查询操作,类似一种链式操作,先指明表名,然后指明条件,最后再进行查询(单个数据结果集用find或者select,多个数据结果集只能用select)。

2. 添加数据 save insertAll insertGetId

2.1 添加一条数据 save

可以使用save方法统一写入数据,自动判断是新增还是更新数据(以写入数据中是否存在主键数据为依据)。

$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::name('user')->save($data);

或者使用 insert 方法向数据库提交数据

$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::name('user')->insert($data);

insert 方法添加数据成功返回添加成功的条数,通常情况返回 1

如果你的数据表里面没有foo或者bar字段,那么就会抛出异常。

2.2 添加多条数据 insertAll

添加多条数据直接向 Db 类的 insertAll 方法传入需要添加的数据(通常是二维数组)即可。

$data = [
    ['foo' => 'bar', 'bar' => 'foo'],
    ['foo' => 'bar1', 'bar' => 'foo1'],
    ['foo' => 'bar2', 'bar' => 'foo2']
];
Db::name('user')->insertAll($data);

insertAll方法添加数据成功返回添加成功的条数

2.3 添加数据并且返回自增主键 insertGetId

添加数据后如果需要返回新增数据的自增主键,可以使用insertGetId方法新增数据并返回主键值:

$data = [
    ['foo' => 'bar', 'bar' => 'foo'],
    ['foo' => 'bar1', 'bar' => 'foo1'],
    ['foo' => 'bar2', 'bar' => 'foo2']
];
$userId = Db::name('user')->insertGetId($data);

insertGetId 方法添加数据成功返回添加数据的自增主键

3. 删除数据 delete

// 根据主键删除
Db::table('think_user')->delete(1);
Db::table('think_user')->delete([1,2,3]);

// 条件删除    
Db::table('think_user')->where('id',1)->delete();
Db::table('think_user')->where('id','<',10)->delete();

最终生成的SQL语句是:

DELETE FROM `think_user` WHERE  `id` = 1 
DELETE FROM `think_user` WHERE  `id` IN (1,2,3) 
DELETE FROM `think_user` WHERE  `id` = 1 
DELETE FROM `think_user` WHERE  `id` < 10

delete方法返回影响数据的条数,没有删除返回 0

4. 更新数据 save update

4.1 save

使用save方法更新数据

Db::name('user')->save(['id' => 1, 'name' => 'thinkphp']);

实际生成的SQL语句是:

UPDATE `think_user`  SET `name`='thinkphp'  WHERE  `id` = 1
4.2 update

update方法返回影响数据的条数,没修改任何数据返回 0.

使用update方法。

Db::name('user')
    ->where('id', 1)
    ->update(['name' => 'thinkphp']);

实际生成的SQL语句是:

UPDATE `think_user`  SET `name`='thinkphp'  WHERE  `id` = 1

小结

使用tp6框架操纵数据库,首先要修改数据库配置文件(config/database.php),配置完毕后,便可以操作数据库了。

然后记得使用时,将模块引入 use think\facade\Db; ,接着便可以使用tp6数据构造器中的方法了。

查询单个数据可以使用find 或者 select,但是查询多条只能使用select 方法。

添加单个数据使用save,添加多条数据可以使用insertAll ,可以通过用insertGetId方法新增数据并返回主键值.

删除数据可以使用delete,更新数据使用save或者update

tp6的数据构造器中的方法可以像链式一样使用…

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
5月前
|
SQL Java 关系型数据库
Java连接MySQL数据库环境设置指南
请注意,在实际部署时应该避免将敏感信息(如用户名和密码)硬编码在源码文件里面;应该使用配置文件或者环境变量等更为安全可靠地方式管理这些信息。此外,在处理大量数据时考虑使用PreparedStatement而不是Statement可以提高性能并防止SQL注入攻击;同时也要注意正确处理异常情况,并且确保所有打开过得资源都被正确关闭释放掉以防止内存泄漏等问题发生。
223 13
|
5月前
|
SQL 关系型数据库 MySQL
MySQL数据库连接过多(Too many connections)错误处理策略
综上所述,“Too many connections”错误处理策略涉及从具体参数配置到代码层面再到系统与架构设计全方位考量与改进。每项措施都需根据具体环境进行定制化调整,并且在执行任何变更前建议先行测试评估可能带来影响。
1419 11
|
11月前
|
关系型数据库 MySQL Java
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
|
11月前
|
数据库连接 应用服务中间件 PHP
|
10月前
|
安全 Linux 网络安全
YashanDB数据库服务端SSL连接配置
YashanDB支持通过SSL连接确保数据传输安全,需在服务端生成根证书、服务器证书及DH文件,并将根证书提供给客户端以完成身份验证。服务端配置包括使用OpenSSL工具生成证书、设置SSL参数并重启数据库;客户端则需下载根证书并正确配置环境变量与`yasc_env.ini`文件。注意:启用SSL后,所有客户端必须持有根证书才能连接,且SSL与密码认证独立运行。
|
9月前
|
SQL 数据库 开发者
Python中使用Flask-SQLAlchemy对数据库的增删改查简明示例
这样我们就对Flask-SQLAlchemy进行了一次简明扼要的旅程,阐述了如何定义模型,如何创建表,以及如何进行基本的数据库操作。希望你在阅读后能对Flask-SQLAlchemy有更深入的理解,这将为你在Python世界中从事数据库相关工作提供极大的便利。
807 77
|
7月前
|
SQL XML Java
配置Spring框架以连接SQL Server数据库
最后,需要集成Spring配置到应用中,这通常在 `main`方法或者Spring Boot的应用配置类中通过加载XML配置或使用注解来实现。
583 0
|
9月前
|
XML 数据库 Android开发
Android数据库的使用(增删改查)
本文介绍了一个简单的数据库操作Demo,包含创建数据库、增删改查功能。通过5个按钮分别实现创建数据库、插入数据、删除数据、更新数据和查询数据的操作。代码结构清晰,适合初学者学习Android SQLite数据库基础操作。
275 5