hyperf 多数据库实时连接方案,极简集成(无需预先定义config连接池,无需重启项目)

本文介绍了如何在PHP8.0及以上版本中集成think-orm库,并在Hyperf项目中进行分库操作,包括配置ThinkDB.php、创建TPModel类以及在控制器中调用数据库。
摘要由CSDN通过智能技术生成

提醒:php 版本需 > 8.0.0,其它版本请使用低版本依赖包。

若本方案不适合你,请查阅第二方案:

https://blog.csdn.net/mark885/article/details/137161410

1.极简集成 think-orm

think-orm文档:https://www.kancloud.cn/manual/think-orm/content

2.老套路安装

hyperf项目中安装:
composer require topthink/think-orm

3.集成

3.1. 项目\config\autoload\thinkdb.php 创建文件并粘贴如下内容:

<?php

return [
    // 默认使用的数据库连接配置
    'default'         => env('DB_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('DB_DRIVER', 'mysql'),
            // 服务器地址
            'hostname'        => env('DB_HOST', '127.0.0.1'),
            // 数据库名 - zsdb_1   zsdb_2   zsdb_3  只需要填写 zsdb_ 即可
            'database'        => 'zsdb_', //env('DB_DATABASE', 'hyperf'),
            // 用户名
            'username'        => env('DB_USERNAME', 'root'),
            // 密码
            'password'        => env('DB_PASSWORD', 'root'),
            // 端口
            'hostport'        => env('DB_PORT', 3306),
            // 数据库连接参数
            'params'          => [],
            // 数据库编码默认采用utf8
            'charset'         => env('DB_CHARSET', 'utf8mb4'),
            // 数据库表前缀
            'prefix'          => env('DB_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,
        ],

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

3.2. 项目\app\System\TPModel\ModelBasic.php 创建文件并粘贴如下内容:

<?php

declare(strict_types=1);

namespace App\System\TPModel;

use think\facade\Db;
use think\Model as ThinkPhpModel;

/*
 * 开发文档参考:https://www.kancloud.cn/manual/think-orm/content
 */
class ModelBasic extends ThinkPhpModel
{
    private static $DbInstance = [];

    /**
     * 构造函数
     */
    public function __construct()
    {
        //var_dump('__construct');
    }

    //连接分库 $dbId = 分库id, $name = 不带前缀的表名
    public static function getSplitDb($dbId = 0, $sheetName = '')
    {
        //TODO 1.加载thinkphp db 配置文件
        $tpDatabase = config('thinkdb');
        //TODO 2.数据库名 重新定义
        $tpDatabase['connections'][$tpDatabase['default']]['database'] .= $dbId;
        //TODO 3.设置数据库连接信息
        Db::setConfig($tpDatabase);
        $dblink = Db::connect($tpDatabase['default']);
        unset($tpDatabase, $dbCfg);
        return !$sheetName ? $dblink : $dblink->name(trim($sheetName));
    }
}

3.3. 项目\app\System\TPModel\SystemUser.php 创建文件并粘贴如下内容:

<?php

declare(strict_types=1);

namespace App\System\TPModel;

use App\System\TPModel\ModelBasic;
/**
* 分库 表 的模型文件
*/
class SystemUser extends ModelBasic
{
    // 设置当前模型对应的完整数据表名称
    protected $table = 'test_sheet';

    public function test()
    {
		return '5555555';
    }
}

4.控制器调用

//todo 1.实例化模型
$tpSystemUserModel = new \App\System\TPModel\SystemUser();
//todo 2.调用模型中方法
$res = $tpSystemUserModel->test();   
//todo 3.调用分库id为1的数据库连接
$zsdb1 = $tpSystemUserModel->getSplitDb(1);
$res1 = $zsdb1->name('test_sheet(不带前缀的分库表名)')->insertGetId(['test_id' => 111]);
//todo 4.调用分库id为2的数据库连接
$zsdb2 = $tpSystemUserModel->getSplitDb(2);
$res2 = $zsdb2->name('test_sheet(不带前缀的分库表名)')->insertGetId(['test_id' => 222]);

5.数据库zsdb_1、zsdb_2 内创建表

DROP TABLE IF EXISTS `test_sheet`;
CREATE TABLE `test_sheet`  (
  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
  `test_id` bigint(20) UNSIGNED NULL COMMENT '测试id',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '测试表' ROW_FORMAT = DYNAMIC;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Web项目开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值