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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 本文介绍了在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的数据构造器中的方法可以像链式一样使用…

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
10天前
|
数据采集 数据库 Python
有哪些方法可以验证用户输入数据的格式是否符合数据库的要求?
有哪些方法可以验证用户输入数据的格式是否符合数据库的要求?
119 75
|
2月前
|
存储 监控 安全
数据库多实例的部署与配置方法
【10月更文挑战第23天】数据库多实例的部署和配置需要综合考虑多个因素,包括硬件资源、软件设置、性能优化、安全保障等。通过合理的部署和配置,可以充分发挥多实例的优势,提高数据库系统的运行效率和可靠性。在实际操作中,要不断总结经验,根据实际情况进行调整和优化,以适应不断变化的业务需求。
|
25天前
|
SQL 关系型数据库 API
HarmonyOs开发:关系型数据库封装之增删改查
每个方法都预留了多种调用方式,比如使用callback异步回调或者使用Promise异步回调,亦或者同步执行,大家在使用的过程中,可以根据自身业务需要进行选择性调用,也分别暴露了成功和失败的方法,可以针对性的判断在执行的过程中是否执行成功。
88 13
|
2月前
|
SQL Oracle 关系型数据库
Oracle数据库优化方法
【10月更文挑战第25天】Oracle数据库优化方法
61 7
|
3月前
|
SQL 关系型数据库 MySQL
Go语言项目高效对接SQL数据库:实践技巧与方法
在Go语言项目中,与SQL数据库进行对接是一项基础且重要的任务
119 11
|
3月前
|
前端开发 Java 数据库连接
javamvc配置,增删改查,文件上传下载。
【10月更文挑战第4天】javamvc配置,增删改查,文件上传下载。
45 1
|
3月前
|
存储 NoSQL API
使用Py2neo进行Neo4j图数据库的增删改查操作
使用Py2neo进行Neo4j图数据库的增删改查操作
153 5
|
3月前
|
SQL 数据库 数据库管理
数据库SQL函数应用技巧与方法
在数据库管理中,SQL函数是处理和分析数据的强大工具
|
3月前
|
数据可视化 API PHP
低代码开发工具-学生管理系统-老师管理增删改查实现
低代码开发工具-学生管理系统-老师管理增删改查实现
56 5
|
3月前
|
JavaScript 前端开发 测试技术
[新手入门]todolist增删改查:vue3+ts版本!
【10月更文挑战第15天】[新手入门]todolist增删改查:vue3+ts版本!