Я создаю приложение, которое требует подключения 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');
Каков наилучший способ динамического подключения нескольких баз данных без снижения производительности приложения?
Один из способов изменить соединение во время выполнения — установить значения через 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(...);
У меня была такая же проблема, как и у вас. Этот блог определенно может помочь вам.
Окончательное руководство для 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);
Таким образом, вы можете использовать модель как обычно, но она имеет динамические соединения с базой данных