首页 > 解决方案 > 动态更改每个模型的 Laravel 数据库连接

问题描述

有没有办法改变 Laravel DB 连接,比如通过 API 调用,并且在 API 调用之前和之后返回的数据对于每个模型都会有所不同?

粗略的概念是:

我有 2 个数据库,比如first_databasesecond_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 条记录(这不起作用)。

这种方法有什么问题吗?还是我需要其他方法来做到这一点?

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

标签: phpmysqllaravelframeworks

解决方案


您可以在 Eloquent 本身中定义数据库连接

protected $connection = "your database connection name";

Laravel Eloquent 数据库连接

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

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

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

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

推荐阅读