我计划创建一个 Web 应用程序(serviceA)来创建一些记录并将其提交到多个其他 Web 应用程序。
所以我想先将数据库连接从serviceA切换到其他连接。
因为问题的答案是手动在 config/database.php 或 .env 中添加连接另一个数据库的信息。
但这不是我的重点。 我想知道我们是否可以通过使用连接信息来连接另一个数据库,而无需将它们添加到 config/database.php 或 .env 中。
因为我想将每个数据库连接信息保存在ServiceA的DB中,并在尝试从ServiceA获取表数据或提交数据时使用它。
这几乎是相同的问题,但尚未解决:Laravel,如何在 config/database.php 文件中附加新连接?
我尝试执行如下:
但它失败了,因为我似乎无法在配置中动态添加新的数据库连接信息。
//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);
}
我想在配置文件中动态添加数组是很困难的。 所以我想知道如何切换数据库连接并获取表信息或将来提交数据。
您可以尝试使用胶囊管理器。
参考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
创建模式、表、查询等的实例。