如何连接到 Laravel 中的另一个数据库(多个数据库 HUNDREDS)[重复]
Posted
技术标签:
【中文标题】如何连接到 Laravel 中的另一个数据库(多个数据库 HUNDREDS)[重复]【英文标题】:How to connect to another database in Laravel (Multiple Database HUNDREDS) [duplicate] 【发布时间】:2020-01-28 08:47:00 【问题描述】:所以我有数百个数据库,我想根据我传入的值更改要使用的数据库
例如,我有许多公司分支机构,其中包含 branch_code(000,001,002,003 等,最多 200)。它们都有相同的表,但只是在不同的数据库中创建的。还假设只有数据库名称不同。我的问题是当有数百个数据库时如何访问不同的数据库?我应该动态更改 .env 文件吗?每当用户选择另一个分支时,我是否应该创建一个更改连接的函数,如果可以,如何?
是的,我尝试通过在 config/database.php 中配置和添加新的数据库连接来连接两个数据库,但我不知道如何处理数百个数据库。有没有更快的方法,也许在 database.php 中添加一个 for 循环?或者可能以某种方式更改 .env DB_DATABASE 变量。
【问题讨论】:
为什么将它们全部放在一个单独的数据库中,当然最好使用 1 个以 branch_code 作为任何键的核心部分的数据库。如果您进行任何数据库更改,您目前必须将其应用于所有这些数据库 - 很容易丢失一两个并可能导致各种问题。 @NigelRen 实际上我并不是创建数据库的人,而是我目前工作的公司。这也是有道理的,因为这家公司有很多子分支,所以不要把他们分开的数据库弄得乱七八糟。而且我无法对其进行更改,因为我的老板说这可能会损坏数据库。 【参考方案1】:最简单的解决方案是在运行时设置数据库配置。 Laravel 可能希望这些设置从 config/database.php 文件中加载,但这并不意味着您以后不能设置或更改它们。
从 config/database.php 加载的配置作为数据库存储在 Laravel 配置中。意思是,config/database.php 中的connections 数组存储在database.connections 中。
因此您可以像这样轻松覆盖/更改这些连接:
Config::set("database.connections.mysql", [
"host" => "...",
"database" => "...",
"username" => "...",
"password" => "..."
]);
从那时起,任何使用这个 mysql 连接的 Eloquent 模型都将使用这个新的数据库连接配置。
如果可能,我建议在服务提供商处进行此操作。
【讨论】:
它总是回到我的默认数据库而不是切换。 谢谢它的工作,我所做的是首先通过 config::get 获取配置,最重要的是在设置之后(从你的示例中)是放置 DB::purge('dbname' )。虽然我建议不要输入“用户名”和“密码”,因为这需要在 .env 中保护【参考方案2】:实际上,除了在 .env 中设置它之外别无他法,因为即使你想让它动态化,你也必须设置 100 个 ifs,如果你只想查看 100 个设置而不编写 100 行代码,你可以在这个文件中设置一个循环:
app/config/database.php
如下:
return array(
'default' => 'mysql',
'connections' => array(
# Primary/Default database connection
'mysql' => array(
'driver' => 'mysql',
'host' => '127.0.0.1',
'database' => 'database1',
'username' => 'root',
'password' => 'secret'
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
),
# You loop here
'mysql2' => array(
'driver' => 'mysql',
'host' => '127.0.0.1',
'database' => 'database2',
'username' => 'root',
'password' => 'secret'
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
),
),
);
这是最简单的方法。所以在这里按照下面的说明,然后在你的雄辩中,你应该指定你想用于那个查询的数据库连接! :
您可以在 Env 文件中设置如下:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=database1
DB_USERNAME=root
DB_PASSWORD=secret
DB_CONNECTION_SECOND=mysql
DB_HOST_SECOND=127.0.0.1
DB_PORT_SECOND=3306
DB_DATABASE_SECOND=database2
DB_USERNAME_SECOND=root
DB_PASSWORD_SECOND=secret
然后您可以进入您的 condif/database.php 并进行如下设置:
'mysql2' => [
'driver' => env('DB_CONNECTION_SECOND'),
'host' => env('DB_HOST_SECOND'),
'port' => env('DB_PORT_SECOND'),
'database' => env('DB_DATABASE_SECOND'),
'username' => env('DB_USERNAME_SECOND'),
'password' => env('DB_PASSWORD_SECOND'),
],
然后在你的口才中你可以使用如下:
$users = DB::connection('mysql2')->select(...);
希望对你有帮助 笔记 : 您可以参考此链接了解更多信息
https://fideloper.com/laravel-multiple-database-connections
【讨论】:
这有点糟糕,必须手动完成,而不是仅仅使用内置函数,尤其是在 .env 文件中。如果没有其他办法,那我该怎么办。以上是关于如何连接到 Laravel 中的另一个数据库(多个数据库 HUNDREDS)[重复]的主要内容,如果未能解决你的问题,请参考以下文章