提醒: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;