如何使用thinkphp实现多租户

这里记录一些碎片思路,方便后面的使用

1:维护一个标准的基础数据库
2:通过该数据库创建新的数据库,以及创建新的配置文件
3: 完成创建后修改其管理员信息

待办实现

  • 1: 配置文件区分多租户
  • 2: 数据源区分多租户
  • 3: 如何解决共享数据库schema

基于TP 的tenant 多租户中间件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
namespace app\http\middleware;

use think\facade\Db;

class TenantMiddleware
{
public function handle($request, \Closure $next)
{
// 获取租户 ID
$tenantId = $request->header('X-Tenant-Id');

// 判断租户 ID 是否存在
if (!$tenantId) {
return response()->json(['error' => 'Tenant ID not found'], 400);
}

// 获取租户的数据库配置信息
$tenantConfig = Db::name('tenants')->where('id', $tenantId)->find();
if (!$tenantConfig) {
return response()->json(['error' => 'Tenant not found'], 404);
}

// 设置数据库连接信息
Db::connect($tenantConfig);

// 继续执行请求
return $next($request);
}
}

快速复制一个库,用于创建多租户库

  1. 创建一个新的数据库

    1
    CREATE DATABASE new_database_name;
  2. 复制基础数据库表到新的库

    1
    mysqldump -u username -p 123456 原始的表名称 > original_database.sql
    1
    mysql -u username -p 新的表名称 < original_database.sql

如何使用thinkphp实现多租户
https://www.ggss.club/2022/12/11/thinkphp-multi-tenant/
作者
Nicol Li
发布于
2022年12月11日
许可协议