Несколько Баз Данных в проекте - как сделать удобно
Иногда возникает задача работать с 2мя и более базами данных, например, одна с данными клиентов, а вторая - с общей информацией. Мы не будем рассматривать процесс настройки - он тривиален и хорошо описано в документации, а остановимся на особенностях проектировани я работы такой системы.
Подготовка моделей
Задача достаточно тривиальная, если не считать одного момента: всем моделям желательно указать коннект, который использовать.
protected $connection= 'second_db_connection';
protected $table = 'agencies';
Зачем это нужно? По-умолчанию, зависимости будут запрашиваться из того-же коннекта, что и основная модель, но если зависимость находится в другой базе - будет ошибка. Чтобы указать, что зависимость нужно тащить именно из второй базы - нужно явно указать коннект
Зависимости
Мы всегда можем использовать зависимости из другой базы для жадной загрузки, например с ->with() или ->load(), НО мы не можем использовать методы типа ->has() или ->whereHas() или ->having() потому что Laravel будет пытаться составить запрос заким образом, чтобы выполнить его за один заход и будет использовать JOIN для его создания, а как мы понимает, JOIN таблицы из другой базы работать не будет.
Так же не будут заботать запросы ->withCount() есди зависимость находится в другой базу по той же самой причине
Миграции
В миграциях очень желательно указывать коннект чтобы самому не запутаться.
Проектирование БД с учетом особенностей
Отдельно стоит обратить внимание на проектирование структуры БД. Одно из главных ограничений - внешние ключи. Проверка целостности данных становится задачкой со звёздочкой. Так же стоит предусмотреть упорядочевание результатов по полям из зависимостей, потому что присоединить таблицу не получиться, потому стоит данные переносить полностью, не только user_id, но так же firstname и другие поля, которые планируется использовать.