Laravel 10.x迁移时如何覆盖Schema连接信息
解决Laravel迁移时临时切换租户数据库连接权限的问题
问题出在Laravel的数据库连接管理机制上:数据库连接实例是单例缓存的,一旦DB::connection('tenant')被首次解析,后续调用会直接复用已创建的旧实例,哪怕你修改了配置,旧实例的凭证不会自动更新。
要在AppServiceProvider中一次性解决这个问题,你需要强制清除已缓存的租户连接实例,再基于更新后的配置重新创建连接,最后替换Schema的连接实例。修改后的代码如下:
public function boot() { foreach ([MigrationStarted::class, MigrationsStarted::class] as $event) { \Event::listen($event, $this->onAnyMigrationStarted(...)); } } private function onAnyMigrationStarted(MigrationStarted|MigrationsStarted $event): void { // 将租户连接的配置替换为管理员凭证 config()->set('database.connections.tenant.username', config('database.connections.gateway.username')); config()->set('database.connections.tenant.password', config('database.connections.gateway.password')); // 清除已缓存的租户连接实例,强制Laravel重新创建连接 DB::purge('tenant'); // 获取基于新配置的租户连接,并设置给Schema $updatedTenantConnection = DB::connection('tenant'); Schema::setConnection($updatedTenantConnection); }
关键说明
DB::purge('tenant'):这个方法会从Laravel的连接管理器中移除已存在的租户连接实例,确保下一次调用DB::connection('tenant')时,会根据最新的配置重新创建连接。- 重新获取连接并设置给Schema:这样后续所有迁移文件中的Schema操作,都会自动使用更新后的管理员连接,无需在每个迁移文件中单独设置。
验证时,在迁移文件中执行dd(Schema::getConnection()->getConfig()),就能看到连接配置已经切换为管理员的用户名和密码了。
内容的提问来源于stack exchange,提问作者Jaquarh
相关产品推荐
相关产品推荐

