Изменить соединение с базой данных при использовании Laravel Auth

В мультитенантном приложении Laravel у каждого арендатора есть собственное подключение к базе данных. Итак, после того, как пользователь выбрал свою базу данных, я хочу аутентифицировать пользователя, используя Auth::loginUsingId. Тем не менее, что бы я ни делал, я не могу изменить подключение модели пользователей на другое значение по умолчанию.

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

Есть ли способ динамически указать соединение, которое аутентификация Laravel должна использовать для аутентификации?


person HouZer    schedule 29.06.2021    source источник
comment
Отвечает ли это на ваш вопрос? Динамическое изменение соединения Laravel   -  person Peter Krebs    schedule 29.06.2021
comment
@PeterKrebs Это решение работает в других случаях, например, при взаимодействии с моделью пользователей, но оно не работает с методами аутентификации laravel.   -  person HouZer    schedule 29.06.2021
comment
Вам необходимо предоставить более конкретную информацию. Как пользователь выбирает базу данных? Что происходит после этого?   -  person apokryfos    schedule 29.06.2021
comment
При входе пользователь указывает свое имя пользователя, пароль и имя базы данных.   -  person HouZer    schedule 29.06.2021
comment
Если вы измените соединение с базой данных по умолчанию, например. config([ 'database.default' => ... ]) вам может понадобиться запустить DB::reconnect после этого, чтобы сбросить соединение   -  person apokryfos    schedule 29.06.2021
comment
Обычно это работает, но не работает при использовании аутентификации Laravel для входа в систему.   -  person HouZer    schedule 29.06.2021


Ответы (2)


Вы можете определить другое соединение в файле config/database.php следующим образом:

return array(
    'connections' => array(
        'mysql' => array(
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'database1',
            'username'  => 'user1',
            'password'  => 'pass1'
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ),

        'second_db_connection' => array(
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'database2',
            'username'  => 'user2',
            'password'  => 'pass2'
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ),
    )

И измените модель пользователя следующим образом:

class User extends Model {

    protected $connection= 'second_db_connection';
    
}
person celyes    schedule 29.06.2021
comment
У меня уже есть несколько подключений для каждого арендатора. Проблема в том, что я хочу указать соединение динамически, так как соединений больше двух. - person HouZer; 29.06.2021
comment
Хорошо, проверьте этот ответ: stackoverflow.com/a/42199159/9453520 - person celyes; 29.06.2021
comment
Это решение работает в других случаях, например, при взаимодействии с моделью пользователей, но оно не работает с методами аутентификации laravel. - person HouZer; 29.06.2021
comment
См. эту тему: laracasts.com/ обсудить/каналы/laravel/ - person celyes; 29.06.2021

Перед аутентификацией пользователя временно измените подключение к базе данных для текущего запроса только с помощью Config::set

$db = "database_name";
Config::set("database.connections.mysql.database", $db);
person Amir Parvez    schedule 29.06.2021
comment
Я уже пробовал это, и это не работает. Кажется, что он использует соединение модели по умолчанию и не может быть перезаписан. Я также пробовал DB::setDefaultConnection($connection), но это тоже не работает... - person HouZer; 29.06.2021
comment
у другой базы данных другое имя пользователя или пароль? если да, то вам также придется обновить его с помощью той же команды. (база данных.подключения.mysql.имя пользователя, база данных.подключения.mysql.пароль). Если нет, то вам придется поделиться с нами ошибкой из лог-файлов. - person Amir Parvez; 29.06.2021
comment
Ошибка заключается в том, что он пытается найти таблицу пользователей в базе данных подключения по умолчанию, а не в базе данных арендатора. - person HouZer; 29.06.2021