如何动态更改mySql连接而无需手动在配置中添加数据库连接信息

问题描述 投票:0回答:1

背景

我计划创建一个 Web 应用程序(serviceA)来创建一些记录并将其提交到多个其他 Web 应用程序。

所以我想先将数据库连接从serviceA切换到其他连接。

前提

  • 我想从其他应用程序获取餐桌信息
  • 获取表数据后,保存到serviceA的DB中
  • 切换DB后提交数据到其他app DB
  • ServiceA 和其他应用程序位于相同的 Docker 网络中,因此一旦执行“docker-compose up -d”,serviceA 的容器、其他应用程序、serviceA 或其他应用程序的数据库、nginx 就会构建
  • 这个问题与我的问题类似但不一样。 如何在 Laravel 中使用多个数据库

因为问题的答案是手动在 config/database.php 或 .env 中添加连接另一个数据库的信息。

但这不是我的重点。 我想知道我们是否可以通过使用连接信息来连接另一个数据库,而无需将它们添加到 config/database.php 或 .env 中。

因为我想将每个数据库连接信息保存在ServiceA的DB中,并在尝试从ServiceA获取表数据或提交数据时使用它。

这几乎是相同的问题,但尚未解决:Laravel,如何在 config/database.php 文件中附加新连接?

如何实施

我尝试执行如下:

  1. 将信息保存在serviceA的DB中,以连接其他应用程序中的DB(例如用户名或主机)
  2. 将它们添加到 config/database.php 中的“connections”中。这是在 DatabaseController.php 中的 save() 中处理的。
  3. 然后先尝试从另一个DB获取表结构

但它失败了,因为我似乎无法在配置中动态添加新的数据库连接信息。

代码

//DatabaseController.php
public function save(Request $request)
    {
        $dbInfo = $request->all();
        $saveDatabase = $this->databaseService->save($dbInfo); //save db connection info in DB
        if ($saveDatabase) {
            $addDbInfoToConfig = $this->_addDbInfoToConfig($saveDatabase);
        }
    }

private function _addDbInfoToConfig($savedDb)
    {
        $dbName = $savedDb->database;
        $dbInfoInConfig = config("database.connections.$dbName");
        if ($dbInfoInConfig) {
            $dbInfo = [
                'driver' => $savedDb->driver,
                'host' => $savedDb->host,
                'database' => $savedDb->database,
                'username' => $savedDb->user_name,
                'password' => base64_decode($savedDb->password),
                'charset' => $savedDb->charset,
                'collation' => $savedDb->collation,
                'prefix' => $savedDb->prefix,
                'strict' => $savedDb->strict == 1 ? true : false,
            ];
            $dbInfoInConfig = Config::set("database.connections.$dbName", $dbInfo);
        }
        return $dbInfoInConfig;
    }

public function tableSetting(int $databaseId)
    {
        $tables = $this->databaseService->getTables($databaseId);
        return $tables;
    }

这就是改变连接和获取表的功能。

public function getTables(int $databaseId)
    {
        $targetDb = Database::find($databaseId);
        $dbInfo = [
            'driver' => $targetDb->driver,
            'host' => $targetDb->host,
            'database' => $targetDb->database,
            'username' => $targetDb->user_name,
            'password' => $targetDb->password,
            'charset' => $targetDb->charset,
            'collation' => $targetDb->collation,
            'prefix' => $targetDb->prefix,
            'strict' => $targetDb->strict == 1 ? true : false,
        ];
        DB::connection($dbInfo);
        $tables = Schema::getAllTables();
        dd($tables);
    }

问题

我想在配置文件中动态添加数组是很困难的。 所以我想知道如何切换数据库连接并获取表信息或将来提交数据。

php laravel docker database-connection
1个回答
0
投票

您可以尝试使用胶囊管理器。

参考https://github.com/laravel/framework/blob/10.x/src/Illuminate/Database/README.md

来自 github 页面的示例:

use Illuminate\Database\Capsule\Manager as Capsule;

$capsule = new Capsule;

$capsule->addConnection([
    'driver' => 'mysql',
    'host' => 'localhost',
    'database' => 'database',
    'username' => 'root',
    'password' => 'password',
    'charset' => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix' => '',
]);

然后您可以使用

$capsule
创建模式、表、查询等的实例。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.