php - 动态更改每个模型的 Laravel 数据库连接
问题描述
有没有办法改变 Laravel DB 连接,比如通过 API 调用,并且在 API 调用之前和之后返回的数据对于每个模型都会有所不同?
粗略的概念是:
我有 2 个数据库,比如first_database和second_database,一个名为mysql的连接,以及一个用于更改连接数据库的 API。每次调用 API 时,mysql连接的数据库都会根据给定的参数进行更改。之后,当我得到模型的数据时,它会有所不同,因为它有不同的数据库。
有没有办法尽可能高效地做到这一点?我调查过:
DB::connection('...')->select('...')
,
config()->set('database.connection', 'second_mysql')
(我尝试使用不同的连接)
和$models = new Model(); $models->setConnection('second_mysql');
。
DB::connection('...')->select('...')
在我看来,两者 $models = new Model(); $models->setConnection('second_mysql');
都不是很有效,因为我有很多模型/表格,我不想改变它们的每一个连接,所以这两个将是我最后的手段。我尝试的是config()->set('database.connection', 'second_mysql')
并且它有效,但也没有。它之所以有效,是因为当我运行此代码时:
config()->set('database.connection', 'second_mysql');
dd(Item::all());
(我有items表,对于first_database它有 3 条记录,对于second_database有 0 条记录)它返回 null(这有效)。但是当我运行该config()->...
部件并将所有项目作为 2 个不同的 API 获取时,获取所有项目API 从first_database返回 3 条记录(这不起作用)。
这种方法有什么问题吗?还是我需要其他方法来做到这一点?
我会留下我不工作的代码以防万一:
- 用于更改连接的 API 方法(当我通过 1 时转储返回second_mysql )
- 获取所有项目的 API 方法(即使我调用了上面的 API,转储也返回了mysql )
解决方案
您可以在 Eloquent 本身中定义数据库连接
protected $connection = "your database connection name";
以您的方式,您正在创建另一个连接,而不是将连接设置为默认值
'default' => env('DB_CONNECTION', 'mysql')
您需要default
即时设置值。所以应该是
config()->set('database.default', 'second_mysql');
推荐阅读
- r - 在不丢失 NULL 的情况下取消列出列表
- azure - Azure OMSforLinux 功能
- php - Laravel Eloquent 访问第三关系
- php - 如何在将选定的数组值发送到 mysql 之前将其内爆?(CakePHP)
- postgresql - 使用 postgres db 在 Spring Boot JPA 中自定义查询
- php - 为什么找不到“类'DI\Bridge\Slim\App'”?PHP
- javascript - 在 Paypal“添加到购物车”按钮中插入下拉菜单、文本字段和复选框
- c# - 如何使用c#.net根据日期从sql数据库中删除元素
- javascript - 如何在 javascript 事件中引用当前的 Vuex 状态和相关的 Vue 实例(this)?
- jenkins - 如何使用 github 为每个 PR 设置 Webhook 以触发 Jenkins Job