Laravel: динамически подключаться к базам данных

Я создаю приложение в Laravel 5 (.1), где необходимо подключиться к различным базам данных. Единственная проблема заключается в том, что он не знал, к каким базам данных он должен подключиться, поэтому использование database.php в config невозможно. Контроллер отвечает за подключение к динамически данным деталям связи.

Как я могу создать новое соединение с базой данных, включая использование класса DB? (Или это возможно)

Спасибо заранее!

Ответ 1

Самое простое решение - настроить конфигурацию базы данных во время выполнения. Laravel может ожидать, что эти настройки будут загружены из файла config/database.php, но это не значит, что вы не сможете установить или изменить их позже.

Конфигурация, загруженная из config/database.php, сохраняется в качестве database в конфигурации Laravel. Это означает, что массив connections внутри config/database.php хранится в файле database.connections.

Таким образом, вы можете легко переопределить/изменить эти соединения следующим образом:

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

С этого момента все модели Eloquent, использующие это соединение mysql будут использовать эту новую конфигурацию соединения с базой данных.

Я бы порекомендовал сделать это в сервис-провайдере, если это возможно.

Ответ 2

Я наткнулся на ту же проблему.

Фактически вы можете изменить настройки базы данных во время выполнения и использовать их.

Используйте функцию config(), чтобы установить дополнительные или перезаписать существующие настройки подключения.

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

Имейте в виду, что эти настройки кэшируются. Поэтому, когда вам нужно использовать новые настройки, очистите кеш БД за соединение, которое вы собираетесь использовать.

DB::purge('mynewconnection');

Вы также можете использовать соединение по умолчанию, которое используется. Это может пригодиться, если вы хотите использовать миграции по разным подключениям и отслеживать их с помощью таблицы миграции в используемом соединении. Или другие крутые вещи, конечно...

DB::setDefaultConnection('mynewconnection');

Ответ 3

Если кто-то ищет пакет для этого, это может помочь