Подключите несколько баз данных динамически в Laravel - PullRequest
0 голосов
/ 28 июня 2018

Я создаю приложение, которое требует подключения 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');

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

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

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

Универсальное руководство для 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);

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

0 голосов
/ 28 июня 2018

Один из способов изменить соединение во время выполнения - установить значения через 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(...);
...