【问题标题】:Change Laravel's DB connection for every Models on the fly dynamically动态更改每个模型的 Laravel 数据库连接
【发布时间】:2021-05-21 05:03:50
【问题描述】:

有没有办法改变 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()->... 部分并将所有 items 作为 2 个不同的 API 时,获取所有 items API 从 first_database 返回 3 条记录(这不起作用)。

这种方法有什么问题吗?或者我需要其他方法吗?

我会留下我不工作的代码以防万一:

【问题讨论】:

标签: php mysql laravel frameworks


【解决方案1】:

你可以在 Eloquent 中定义数据库连接

protected $connection = "your database connection name";

Laravel Eloquent Database Connections

以您的方式,您正在创建另一个连接,而不是将连接设置为默认值

'default' => env('DB_CONNECTION', 'mysql')

您需要即时设置default 的值。所以应该是

config()->set('database.default', 'second_mysql');

【讨论】:

  • 我也试过这个,但它并没有真正得到我想要的,它正在改变连接。我尝试使用第一个 API 更改模型的连接,但在调用 get all items API 时仍然无法正常工作。
猜你喜欢
  • 2015-05-13
  • 1970-01-01
  • 2022-06-25
  • 2017-12-26
  • 2016-07-05
  • 2017-07-01
  • 2016-02-16
  • 2019-09-30
  • 2016-01-07
相关资源
最近更新 更多