Laravel:动态连接数据库

时间:2016-03-18 13:03:11

标签: php mysql laravel laravel-5.1

我正在Laravel 5(.1)中创建一个应用程序,需要连接到不同的数据库。唯一的问题是它不知道它必须连接到哪个数据库,因此在配置中使用database.php是不可能的。控制器负责与动态给定的连接细节建立连接。

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

提前致谢!

4 个答案:

答案 0 :(得分:18)

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

config/database.php加载的配置在Laravel配置中存储为database。这意味着connections内的config/database.php数组存储在database.connections

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

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

从那时起,任何使用此mysql连接的Eloquent模型都将使用这个新的数据库连接配置。

如果可能的话,我建议在服务提供商处这样做。

答案 1 :(得分:10)

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

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

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

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

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

DB::purge('mynewconnection');

您还可以操纵使用的默认连接。如果您希望在不同的连接上使用迁移并使用已使用连接中的迁移表跟踪它们,这可以派上用场。或其他很酷的事情...

DB::setDefaultConnection('mynewconnection');

答案 2 :(得分:2)

您可能需要使用以下内容:

use Illuminate\Support\Facades\Config;
use DB;

设置数据库配置:

        Config::set("database.connections.mysql_external", [
            'driver' => 'mysql',
            "host" => "localhost",
            "database" => "db_name",
            "username" => "root",
            "password" => "root",
            "port" => '8889',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'strict'    => false,
        ]);

连接到数据库并执行操作:

    $users = DB::connection('mysql_external')->select('Select id from users');

断开数据库连接并重置配置变量

        DB::disconnect('mysql_external');
        Config::set("database.connections.mysql_external", [
            'driver' => 'mysql',
            "host" => "localhost",
            "database" => "",
            "username" => "",
            "password" => "",
            "port" => '',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'strict'    => false,
        ]);

答案 3 :(得分:1)

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

   #!/bin/sh
   echo "The app is starting ..."
   exec java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom  -jar -Dspring.profiles.active=${SPRING_ACTIVE_PROFILES} "${HOME}/myapp.jar" "$@"