Laravel: connect to databases dynamically

前端 未结 4 1935
盖世英雄少女心
盖世英雄少女心 2020-11-29 03:52

I\'m creating an application in Laravel 5(.1) where it is needed to connect to different databases. The only problem is that it\'s not known which databases it has to connec

相关标签:
4条回答
  • 2020-11-29 04:30

    You might need to use these:

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

    Set database configurations:

            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,
            ]);
    

    Connect to database and do stuff:

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

    Disconnect database and reset config variables

            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,
            ]);
    
    0 讨论(0)
  • 2020-11-29 04:32

    I ran into this problem too with a script that imports multiple MS Access DB files into MySQL and I was not satisfied with any of the solutions which suggested editing configuration at runtime. It was ugly and messy to dynamically create a new config for every single Access DB file that I wanted to import. After some playing, I manged to persuade Laravel to switch DBs on the existing connection like this:

    $mysqlConn = DB::connection();
    $mysqlConn->getPdo()->exec("USE $schemaName;");
    $mysqlConn->setDatabaseName($schemaName);
    
    0 讨论(0)
  • 2020-11-29 04:34

    I've stumbled upon the same problem.

    You can actually change database settings in runtime and use them.

    Use the config() function to set extra or overwrite existing connection settings.

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

    Keep in mind that these settings are cached. So when you need to use the new settings, purge the DB cache for the connection you're gonna use.

    DB::purge('mynewconnection');
    

    You can also manipulate the default connection that is used. This can come in handy if you wish to use migrations over different connections and keep track of them with a migration table within the used connection. Or other cool stuff ofcourse...

    DB::setDefaultConnection('mynewconnection');
    
    0 讨论(0)
  • 2020-11-29 04:37

    The simplest solution is to set your database config at runtime. Laravel might expect these settings to be loaded from the config/database.php file, but that doesn't mean you can't set or change them later on.

    The config loaded from config/database.php is stored as database in Laravel config. Meaning, the connections array inside config/database.php is stored at database.connections.

    So you can easily override/change these connections like this:

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

    From there on out, any Eloquent models that use this mysql connection will be using this new database connection config.

    I'd recommend doing this in a Service Provider if possible.

    0 讨论(0)
提交回复
热议问题