如何连接到 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)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

连接到 codeigniter 中的另一个数据库并插入

在 laravel 5.8 中连接到第二个数据库时出错

Laravel 无法连接到其他数据库服务器

laravel如何检查表中的记录连接到用户表

无法连接到 laravel 5.6 中的数据库 xampp

如何将带有前缀列的表连接到 PHP MySQL 或 Laravel 中的另外两个表