VariusRain
@VariusRain
музыкант-программист-конструктор

Почему не применяются настройки подключения в Laravel на лету?

Ситуация крайне странная и, чувствую, что я просто упустил какую-то мелочь.
Есть контейнер posgresql в докер, там две базы. По умолчанию приложение работает с одной из них, но иногда в редких случаях нужно на лету переключиться на другую.
Раньше я такое делал просто перепрописывая конфиг через через хелпер фунции либо через \Config::set()
И всё работало. Я даже загялнул в свои же старые проекты, где я уверен, что всё работает.
(Но там не было докера, возможно дело в этом, хоть я и сильно сомневаюсь)

Тут же получаю следующее поведение:
$config = \Config::get('database.connections.pgsql');
$config['database'] = $settings->db_name;
\Config::set('database.connections.pgsql', $config);

echo SomeModel::query()->count();

На выходе получаю число строк в таблице, что лежит в базе по умолчанию, а не в той, которую я указал двумя строчками выше.

При этом, если вывести содержимое
dd(config('database.connections.pgsql'))
Там всё прекрасно и там изменённые данные

Подскажите пожалуйста, что я упустил?
  • Вопрос задан
  • 140 просмотров
Решения вопроса 1
VariusRain
@VariusRain Автор вопроса
музыкант-программист-конструктор
Получилось найти решение самостоятельно.
Подойдёт, возможно, не всем, так что обратите внимание на ответ Григорий Васильков

В моём же случае подошёл просто принудительный реконнект к базе после смены настроек
\DB::connection('pgsql')->reconnect();
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
gzhegow
@gzhegow
aka "ОбнимиБизнесмена"
Там есть приколы связанные с инициализацией и что каждая модель умеет в getConnection() который может быть дефолтный. Надо не конфиг менять, а в самой модельке втыкивать. Не спрашивай почему. Что у Тима в голове сложный вопрос...
Ответ написан
iMedved2009
@iMedved2009
Не люблю людей
1. Если ваша модель использует 2 базы данных, то есть метод setConnection() использовать надо его. если надо
echo SomeModel::setConnection('')->count();

2. Если у вас одна модель работает с одной базой, а другая с другой то вы можете в модели прописать
protected $connection = '';

Используется это для вещей когда поток данных большой что один сервер не справляется - по этому идет либо разнос по read-write, в мастер пишем, со слейва читаем, либо просто вынос каких то данных на другой сервер, либо для шардирования когда у вас данные разбиты на шарды по куче серверов. У Тима в голове сложные варианты, а не поделки для 2 посетителей.

3. Передергивать для этого конфиг и делать реконнект - не рекомендуется.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы