在一个项目中,如何实现,用户选择不同主体临时连接到不能数据库呢?

业务场景是这样的:

  • 用户可拥有多个企业。
  • 使用同一的登录接口。

需求是:用户登录成功后,通过选择不同的企业主体,进行相关的操作时,临时连接到选择企业主体的数据库,以完成用户在该企业主体下的业务以及相关的数据存储。。

不知道有没有大佬指点下,通过laravel 如何实现。

user 表
company 表
company_own_db 表 (一对一)
user_company 表 (多对多)

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 19

全局作用域可以实现

3个月前 评论

@hello-bug 全局作用域?大佬能说明白点吗?

3个月前 评论

@carveybunt 在database.php建立不同的connections(a、b、b...) 用户可以选择www.test.com/a、www.test.com/b、www.test.com/c... 根据不同请求在全局作用域中切换到不同的connection

3个月前 评论

中间件中可以根据企业标识,切换数据库配置,达到你需要的效果

3个月前 评论

@hello-bug 有没有更便捷的方法呢?数量少的话,这样确实可以,但是数量多情况下,就麻烦了呀,几百几千个企业的时候。用户和企业是多对多关系。

3个月前 评论

@Katherine 这个我也想过,就是不知道如何实现。我个人的想法是,只操作相关的数据读取时才进行切换,默认依然使用项目中的数据库。

3个月前 评论
  1. 建一个总用户表,包含登陆信息和所属项目关联关系
  2. 创建一个项目表,存对应的数据库连接信息
  3. 用户登陆走统一的接口,查询总用户表的信息,验证通过之后根据和项目的关系联系,查询出对应的数据库配置。然后全局使用查询结果的数据库连接。 因为我现在使用的不是laravel,用的yii,具体实现的东西没法给建议。
3个月前 评论

这个需求不是那么好做的 不可能把所有的企业的数据库配置文件都配置在database的配置文件中,应该是有企业信息的表来存储企业的数据信息 用户来的时候 手动原生pdo 创建该企业的连接

3个月前 评论
Gerry201999 3个月前

建立一个中心数据库,存储用户与企业之前的关系,根据企业标识去链接不同的数据库

3个月前 评论

laravel多租户扩展包了解一下 github.com/stancl/tenancy

3个月前 评论

@打好备注我是李顺 多谢,不过不准备用全局,因为本地还有数据要进行交互,就是想在对应操作读取数据是切换数据库。 user表 company表 company_own_db表(一对一) user_company表(多对多)

3个月前 评论
Gerry201999 3个月前
carveybunt (作者) (楼主) 3个月前
snakelis 3个月前
snakelis 3个月前
carveybunt (作者) (楼主) 3个月前

@carveybunt 不知道你是怎么设计企业与数据库的对应关系的,简单点,使用 config 函数设置数据库配置信息。
全局作用域的方式应该不能满足你的需要。
你的问题标题是不同用户,连接到不同数据库,可以直接在中间件中切换,一键解决。
但如果是某些接口或某些模块需要连接到不同数据库,建议根据业务划分,从接口或模块中抽象出来一层,去做统一切换;再细点,如果某一方法中,获取的数据涉及到多连接,建议拆分一下业务代码,尽量做到单方法单连接,将数据库切换做到方法级别。统一登录,在token中携带企业ID,用来置换数据库配置。

3个月前 评论

@Katherine 不好意思,我表达有误。 我现在想要实现的是:不同用户登录后,可以选择不同的企业。在进行数据读取时,通过不同企业的标识,来进行企业对应的数据库连接(临时),进而完成用户在该企业下的业务与数据读取。

3个月前 评论

@91hero 多谢,一会我学习学习

3个月前 评论

@carveybunt
那你需要的是譬如说,某一模块需要切换数据库,在选择某一企业后需要读写不同数据库, :joy:那直接在路由文件中、服务提供者中,或者控制器中添加中间件,根据请求中携带的项目ID或标识换取数据库配置后切换,未携带直接拒绝请求。直接切换就好了哦

3个月前 评论

@Katherine 但是官方文档中,没有找到相关的切换说明。我是打算在模型中进行切换。不知道您这里有没有相关的文档链接吗?

3个月前 评论

@carveybunt 模型中是切换连接名。 按照你所想的,你需要在 database.php 中提前声明好所有的配置信息,或者在代码中动态添加一个connection,然后调用模型方法 setConnection('xxx'),再去通过模型或Builder读写。这样可以曲线救国,可以用于一个请求多个切换。但你如果不是一个请求多个切换,就不需要这样写了,直接 config(['database.connections.mysql'],[企业数据库配置])切换,app('db')->getConfig()$model->getConnection()->getConfig()DB::connection()->getConfig() 获取到的都是切换后的配置信息。

3个月前 评论

我很好奇,这样每一个选择就是一个数据库,当发生表字段修改和新增表的时候,数据库怎么同步

3个月前 评论
ware 3个月前
snakelis 3个月前
carveybunt (楼主) 3个月前

@Katherine 多谢,昨天忙其他的去了,有时间我试试

3个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!