Laravel:动态连接到数据库

问题描述 投票:18回答:3

我正在Laravel 5(.1)中创建一个应用程序,在该应用程序中需要连接到不同的数据库。唯一的问题是,它不知道必须连接到哪个数据库,因此无法在config中使用database.php。控制器负责使用动态给定的连接详细信息进行连接。

我如何建立与数据库的新连接,包括使用DB类? (或者这可能)

提前感谢!

php mysql laravel laravel-5.1
3个回答
26
投票

最简单的解决方案是在运行时设置数据库配置。 Laravel可能希望这些设置会从config/database.php文件中加载,但这并不意味着您以后无法设置或更改它们。

config/database.php加载的配置存储为database在Laravel配置中。意思是,connections内部的config/database.php数组存储在database.connections

因此,您可以像这样轻松地覆盖/更改这些连接:

Config::set("database.connections.mysql", [
    "host" => "...",
    "database" => "...",
    "username" => "...",
    "password" => "..."
]);

从此以后,使用此mysql连接的所有Eloquent模型都将使用此新的数据库连接配置。

如果可能,我建议在服务提供商中进行此操作。


13
投票

我偶然发现了相同的问题。

您实际上可以在运行时更改数据库设置并使用它们。

使用config()函数设置额外的或覆盖现有的连接设置。

config(['database.connections.mynewconnection' => {settings here}]);

请注意,这些设置已缓存。因此,当您需要使用新设置时,请清除将要使用的连接的数据库缓存。

DB::purge('mynewconnection');

您还可以操纵使用的默认连接。如果您希望在不同的连接上使用迁移,并使用已使用的连接内的迁移表来跟踪迁移,这将很方便。或其他很酷的课程...

DB::setDefaultConnection('mynewconnection');

0
投票

我也遇到了一个脚本,该脚本将多个MS Access DB文件导入MySQL,并且我对建议在运行时编辑配置的任何解决方案都不满意。动态地为我要导入的每个Access DB文件创建一个新的配置是很丑陋和混乱的。经过一番游戏之后,我设法说服Laravel在现有连接上切换数据库,如下所示:

$mysqlConn = DB::connection();
$mysqlConn->getPdo()->exec("USE $schemaName;");
$mysqlConn->setDatabaseName($schemaName);
© www.soinside.com 2019 - 2024. All rights reserved.