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
相关产品推荐
相关产品推荐

