在一个项目中,如何实现,用户选择不同主体临时连接到不能数据库呢?
业务场景是这样的:
- 用户可拥有多个企业。
- 使用同一的登录接口。
需求是:用户登录成功后,通过选择不同的企业主体,进行相关的操作时,临时连接到选择企业主体的数据库,以完成用户在该企业主体下的业务以及相关的数据存储。。
不知道有没有大佬指点下,通过laravel 如何实现。
user 表
company 表
company_own_db 表 (一对一)
user_company 表 (多对多)
关于 LearnKu
全局作用域可以实现
@hello-bug 全局作用域?大佬能说明白点吗?
@carveybunt
在database.php建立不同的connections(a、b、b...) 用户可以选择www.test.com/a、www.test.com/b、www.test.com/c... 根据不同请求在全局作用域中切换到不同的connection中间件中可以根据企业标识,切换数据库配置,达到你需要的效果
@hello-bug 有没有更便捷的方法呢?数量少的话,这样确实可以,但是数量多情况下,就麻烦了呀,几百几千个企业的时候。用户和企业是多对多关系。
@Katherine 这个我也想过,就是不知道如何实现。我个人的想法是,只操作相关的数据读取时才进行切换,默认依然使用项目中的数据库。
这个需求不是那么好做的 不可能把所有的企业的数据库配置文件都配置在database的配置文件中,应该是有企业信息的表来存储企业的数据信息 用户来的时候 手动原生pdo 创建该企业的连接
laravel多租户扩展包了解一下 github.com/stancl/tenancy
@打好备注我是李顺 多谢,不过不准备用全局,因为本地还有数据要进行交互,就是想在对应操作读取数据是切换数据库。 user表 company表 company_own_db表(一对一) user_company表(多对多)
@carveybunt 不知道你是怎么设计企业与数据库的对应关系的,简单点,使用
config函数设置数据库配置信息。全局作用域的方式应该不能满足你的需要。
你的问题标题是
不同用户,连接到不同数据库,可以直接在中间件中切换,一键解决。但如果是某些接口或某些模块需要连接到不同数据库,建议根据业务划分,从接口或模块中抽象出来一层,去做统一切换;再细点,如果某一方法中,获取的数据涉及到多连接,建议拆分一下业务代码,尽量做到单方法单连接,将数据库切换做到方法级别。统一登录,在token中携带企业ID,用来置换数据库配置。
@Katherine 不好意思,我表达有误。 我现在想要实现的是:不同用户登录后,可以选择不同的企业。在进行数据读取时,通过不同企业的标识,来进行企业对应的数据库连接(临时),进而完成用户在该企业下的业务与数据读取。
@91hero 多谢,一会我学习学习
@carveybunt
那直接在路由文件中、服务提供者中,或者控制器中添加中间件,根据请求中携带的项目ID或标识换取数据库配置后切换,未携带直接拒绝请求。直接切换就好了哦
那你需要的是譬如说,某一模块需要切换数据库,在选择某一企业后需要读写不同数据库,
@Katherine 但是官方文档中,没有找到相关的切换说明。我是打算在模型中进行切换。不知道您这里有没有相关的文档链接吗?
@carveybunt 模型中是切换连接名。 按照你所想的,你需要在
database.php中提前声明好所有的配置信息,或者在代码中动态添加一个connection,然后调用模型方法setConnection('xxx'),再去通过模型或Builder读写。这样可以曲线救国,可以用于一个请求多个切换。但你如果不是一个请求多个切换,就不需要这样写了,直接config(['database.connections.mysql'],[企业数据库配置])切换,app('db')->getConfig()或$model->getConnection()->getConfig()或DB::connection()->getConfig()获取到的都是切换后的配置信息。我很好奇,这样每一个选择就是一个数据库,当发生表字段修改和新增表的时候,数据库怎么同步
@Katherine 多谢,昨天忙其他的去了,有时间我试试