Laravel один домен, несколько баз данных, обнаруженных сессией - PullRequest
0 голосов
/ 29 апреля 2019

Я прочитал несколько сообщений / тем (например, , это , , это и , это ) на тему SaaS, Multi-Tenant и т. Д., И я достигвывод, что большинство из них не соответствуют моим требованиям:

  1. Мне не нужен мультитенант, поскольку я собираюсь использовать только основной домен
  2. Я могуне пишите ни в .env, ни в database.config все мои подключения MySQL, так как все они будут динамическими (по крайней мере, имя базы данных)

Рабочий процесс, который мне нужен :

  1. Подписки (SaaS) содержат имя базы данных
  2. Всякий раз, когда логин пользователя назначается его сеансу, имя базы данных
  3. Запускает все запросы к базе данных пользователей.

Пример:

- project_admin <- Main database 
--- subscriptions <- Table
------ id | db_name
------ 1  | project_child_one
------ 2  | project_child_two
--- users <- Table
------ id | subscription_id 
------ 1  | 1 
------ 2  | 2

- project_child_one <- Child database
--- customers <- table

- project_child_two <- Child database
--- customers <- table
  • Когда user 1 логин, данные, полученные от клиентов, должны быть из базы данных project_child_one.
  • Когдаuser 2 логин, данные, полученные от клиентов, должны быть из базы данных project_child_two.

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

Ответы [ 2 ]

0 голосов
/ 30 апреля 2019

Если вам действительно требуется подключение к базе данных «арендатора», вы можете настроить его на лету в классе промежуточного программного обеспечения:

class ConfigureTenantConnection
{
    public function handle($request, Closure $next)
    {
        if ($user = $request->user()) {
            // Create a tenant database connection if there is an authenticated user
            config([
                'database.connections.tenant' => [
                    'driver' => 'mysql',
                    // I don’t know what column names you use, but…
                    'host' => $user->database_host,
                    'port' => $user->database_port,
                    'database' => $user->database_name,
                    'username' => $user->database_username,
                    'password' => $user->database_password,
                ],
            ]);
        }

        return $next($request);
    }
}

Затем вы можете использовать это соединение tenant в запросах и моделях базы данных:

abstract class TenantModel extends Model
{
    protected $connection = 'tenant';
}

class Widget extends TenantModel
{
    protected $table = 'widgets';
}
0 голосов
/ 29 апреля 2019

Ну, я не уверен, что это то, что вы имели в виду.Но если вы хотите, чтобы имя db было динамическим, вы можете легко сделать это в laravel следующим образом.Часть соединений config должна быть такой же, как указано выше.Однако вы можете изменить учетные данные базы данных на контроллере во время выполнения.Если взять приведенный выше пример для конфигурации, то.Вы можете сделать это на контроллере.

    $config= [
            'database'=>'Dynamic db name',
    ];
    Config::set("database.connections.mysql2",$config);
    DB::purge('mysql');
    DB::setDefaultConnection('mysql2');

И предположим, что вы хотите переключить другую БД после транзакции, вы можете сделать это следующим образом:

     $config= [
            'database'=>'Dynamic db name',
    ];
    Config::set("database.connections.mysql",$config);
    DB::purge('mysql2');
    DB::setDefaultConnection('mysql2');

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...