You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel项目单域名多租户多数据库动态切换方案咨询

实现Laravel多租户多数据库自动切换方案

1. 配置基础数据库连接

修改项目config/database.php文件,提前配置主库和租户模板连接:

return [
    // 先把默认连接设置为master,保证登录阶段读取主库用户信息
    'default' => 'master',
    'connections' => [
        // 主库连接,存储全局用户信息
        'master' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'master'),
            'username' => env('DB_USERNAME', 'root'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],
        // 租户连接模板,数据库名后续动态赋值
        'tenant' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => null,
            'username' => env('TENANT_DB_USERNAME', 'root'),
            'password' => env('TENANT_DB_PASSWORD', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],
    ]
];

2. 主库用户表增加租户标识字段

在master库的users表中新增tenant_db_name字符串字段,分别给对应用户存入专属数据库名:用户A存user_a,用户B存user_b。

3. 编写租户切换中间件

执行命令生成中间件:php artisan make:middleware SwitchTenantDatabase
编辑中间件逻辑,登录后自动切换对应租户数据库:

<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class SwitchTenantDatabase
{
    public function handle(Request $request, Closure $next)
    {
        // 仅已登录用户触发切换
        if (auth()->check()) {
            // 读取当前用户绑定的租户库名
            $tenantDb = auth()->user()->tenant_db_name;
            // 动态修改租户连接的数据库配置
            config(['database.connections.tenant.database' => $tenantDb]);
            // 清空旧连接缓存,重新建立连接
            DB::purge('tenant');
            DB::reconnect('tenant');
        }
        return $next($request);
    }
}

将中间件注册到app/Http/Kernel.php的路由组中,加到需要租户权限的路由组下(比如web路由组、api的auth路由组),确保登录校验通过后再执行切换逻辑。

4. 模型绑定对应连接

  • 主库相关模型(比如用户模型User.php),指定固定走主库连接:
protected $connection = 'master';
  • 租户业务相关模型,指定走租户连接:
protected $connection = 'tenant';

注意事项

  • 登录校验逻辑全程用master连接,避免切换连接后读不到用户信息
  • 所有租户的数据库表结构需保持一致,避免业务模型调用报错
  • 需要跨库操作时可显式指定连接:DB::connection('master')->table('users')->get()

内容的提问来源于stack exchange,提问作者TEST AMINE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 20:15:02