Laravel изменение БД во время выполнения - PullRequest
0 голосов
/ 05 мая 2020

У меня есть приложение с одноуровневой базой данных для входа пользователей и N базами данных для одного или нескольких пользователей. Я хочу изменить БД после входа в систему. параметры db хранятся в таблице пользователя, поэтому после входа в систему у меня есть это:

        Config::set("database.connections.mysql", [
        "host" => "localhost",
        "driver" => "mysql",
        'default' => 'mysql',
        "database" => $dati->db,
        "username" => "root",
        "password" => ""

    ]);


    DB::reconnect('mysql');

, где $ dati-> db - это имя базы данных для зарегистрированного пользователя. он работает только в текущем контроллере, но все остальные модели и контроллеры не имеют новой базы данных и возвращают ошибку для отсутствующих таблиц.

как я могу распространить новые настройки на все модели?

заранее спасибо.

1 Ответ

0 голосов
/ 05 мая 2020

Вы должны поместить его в промежуточное ПО. Например:

<?php
class UserDatabaseMiddleware {
    public function handle($request, \Closure $next){
        $databaseName = $request->user()->db;
        config(['database.connections.mysql.database' => $databaseName]);
        return $next($request);
    }
}

Затем вы должны определить его в App \ Http \ Kernel. php

<?php
protected $routeMiddleware = [
    'dbselect' => UserDatabaseMiddleware::class
]

И, наконец, вы можете добавить его в свой файл маршрута. Например:

<?php
Route::group([
    'middleware' => 'dbselect',
], function(){
    Route::get('/', [MyController::class, 'myMethod'])->name('index');
})

Теперь конфигурация должна изменяться с каждым HTTP-запросом, если пользователь вошел в систему.

Важно: Как было упомянуто в комментариях - наличие нескольких баз данных на пользователя - плохой подход. Вы должны это учитывать. Есть другой способ сделать это - вы можете указать user_id для каждой записи в таблице, а затем создать глобальную область видимости для выбора только записей вошедшего в систему пользователя.

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