Laravel:动态连接数据库

Rob*_*ads 14 php mysql laravel laravel-5.1

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

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

提前致谢!

jsz*_*ody 23

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

从中加载的配置config/database.php存储database在Laravel配置中.意思是,connections里面的数组config/database.php存储在database.connections.

因此,您可以轻松地覆盖/更改这些连接,如下所示:

Config::set("database.connections.mysql", [
    "host" => "...",
    "database" => "...",
    "username" => "...",
    "password" => "..."
]);
Run Code Online (Sandbox Code Playgroud)

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

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

  • 抱歉,重新打开旧线程,迁移如何与此配合使用? (2认同)

fes*_*skr 11

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

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

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

config(['database.connections.mynewconnection' => {settings here}]);
Run Code Online (Sandbox Code Playgroud)

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

DB::purge('mynewconnection');
Run Code Online (Sandbox Code Playgroud)

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

DB::setDefaultConnection('mynewconnection');
Run Code Online (Sandbox Code Playgroud)

  • 我缺少 DB::purge( ... ); (2认同)

Der*_*rek 6

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

$mysqlConn = DB::connection();
$mysqlConn->getPdo()->exec("USE $schemaName;");
$mysqlConn->setDatabaseName($schemaName);
Run Code Online (Sandbox Code Playgroud)


PHP*_*... 5

您可能需要使用这些:

use Illuminate\Support\Facades\Config;
use DB;
Run Code Online (Sandbox Code Playgroud)

设置数据库配置:

        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,
        ]);
Run Code Online (Sandbox Code Playgroud)

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

    $users = DB::connection('mysql_external')->select('Select id from users');
Run Code Online (Sandbox Code Playgroud)

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

        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,
        ]);
Run Code Online (Sandbox Code Playgroud)