Подключите несколько баз данных динамически в Laravel

Я создаю приложение, которое требует подключения 2 базы данных. Первый статический, а другой динамичный.
config / database.php похож на

'mysql' =>
array (
'driver' => 'mysql',
'host' => '127.0.0.1',
'port' => '3306',
'database' => 'blog',
'username' => 'root',
'password' => '',
'unix_socket' => '',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => NULL,
),
'business2' =>
array (
'driver' => 'mysql',
'host' => '127.0.0.1',
'port' => '3306',
'database' => 'blog2',
'username' => 'root',
'password' => '',
'unix_socket' => '',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => NULL,
),

и код модели похож

Class  TableNewData extends Model
{
protected $connection = 'business3';
protected $table = 'table2_data';
public function getData()
{
return $this->get()->toArray();
}
}

Я могу подключиться к нескольким базам данных, если я предоставляю статические данные о подключении, но я не могу подключиться к базе данных, если я предоставляю такие динамические данные, как

 $connection = Session::get()->connection;

или же

$connection=$_SESSION('connection');

Каков наилучший способ динамического подключения нескольких баз данных без снижения производительности приложения?

1

Решение

Один из способов изменить соединение во время выполнения — установить значения через config:

config(['database.connections.mysql' => [
'driver'    => 'mysql',
'host'      => env('DB_HOST', 'localhost'),
'database'  => env('DB_DATABASE', 'my_database'),
'username'  => env('DB_USERNAME', 'my_user'),
'password'  => env('DB_PASSWORD', 'my_password'),
'charset'   => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix'    => '',
'strict'    => false,
]]);

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

Вы также можете указать соединение через фасад БД:

DB::connection('mysql_2')->select(...);
0

Другие решения

У меня была такая же проблема, как и у вас. Этот блог определенно может помочь вам.

Окончательное руководство для Laravel Multi Tenant с несколькими базами данных

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

'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'blog'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', 'password'),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => 'InnoDB',
],
'business' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => '',
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', 'password'),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => 'InnoDB',
],

По сути, установите вспомогательную функцию базы данных, которая подключается к базе данных во время выполнения и затем вызывает ее в нужном промежуточном программном обеспечении. Я просто помещаю вспомогательный файл в database / utilities / helpers.php

function connect($hostname, $username, $password, $database)
{
// Erase the tenant connection, thus making Laravel get the default values all over again.
DB::purge('business');
// Make sure to use the database name we want to establish a connection.
Config::set('database.connections.tenant.host', $hostname);
Config::set('database.connections.tenant.database', $database);
Config::set('database.connections.tenant.username', $username);
Config::set('database.connections.tenant.password', $password);
// Rearrange the connection data
DB::reconnect('business');
// Ping the database. This will throw an exception in case the database does not exists.
Schema::connection('tenant')->getConnection()->reconnect();
}

Не забудьте сообщить композитору, что вспомогательную функцию можно использовать глобально, добавив эти строки в файл composer.json.

"autoload": {
"classmap": [
"database"],
"files":[
"database/utilities/helpers.php"],
"psr-4": {
"App\\": "app/"}
},

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

class StaticModel extends Model
{
protected $connection = 'mysql';
}
class DynamicModel extends Model
{
protected $connection = 'business';
}

В промежуточном программном обеспечении установите динамическое соединение с базой данных в соответствии с именем базы данных.

connect(getenv('DB_HOST'), getenv('DB_USERNAME'), getenv('DB_PASSWORD'), getenv('DB_SYMBOL') . $databasename);

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

1

По вопросам рекламы [email protected]