где $connection - имя соединения из конфигурации, где можно указать два хоста - один для чтения, другой для записи. Можно два хоста указать в дефолтной конфигурации тоже. Например, у нас обычно в дефолтном соединении всегда реплика чтения указана для админки,
но есть второй коннекшн с именем reports, который смотрит на другую реплику, и мы там просто делаем
Код:
SomeReport::on('reports')->fetch() ...
Можно и явно переключить коннекшн, сменив соединение прямо у капсулы.
Только она тупо все селекты на слейв направит, а запись на мастер. А для избежания использования старых данных для записи, надо ВСЕ запросы на мастер слать, когда хотим писать данные, поэтому там надо осторожнее. Но вообще да, это проще с идеологической точки зрения, чем то, о чем Гриша говорит. Там придётся некрасивые условия прописывать и коннекшен нужный для определенного запроса вычислять.
Только она тупо все селекты на слейв направит, а запись на мастер. А для избежания использования старых данных для записи, надо ВСЕ запросы на мастер слать, когда хотим писать данные
Я это решаю просто немного в другом месте: я нарезал на микросервисы, когда еще это не было модным, и те места, которые пишут в базу активно, вообще не имеют в коннекшне реплики.
Я это решаю просто немного в другом месте: я нарезал на микросервисы, когда еще это не было модным, и те места, которые пишут в базу активно, вообще не имеют в коннекшне реплики.
Только она тупо все селекты на слейв направит, а запись на мастер. А для избежания использования старых данных для записи, надо ВСЕ запросы на мастер слать, когда хотим писать данные, поэтому там надо осторожнее.
Опять таки, это нельзя решить автоматически, потому-что никакой фреймворк не определит критичность чтения данных для инсерта сам. Но очень легко - с именованными коннекшнами на уровне приложения:
я конечно понимаю что это не меняет проблему в целом, что слейв не всегда догоняет и кроме как притормозить пользователя сообщением о удачной записи или повторной попыткой чтения это не решить, но если я понимаю о чем вы говорите, то надо тупо в команды (весь UoW) инжектить мастера а в запросы что осталось.
ну уж я пытаюсь на примере пдо объяснить, раз о ней речь, так-то она сама по себе неудачный пример. В целом мысль в том, что наследование нужно для изменения реализации контракта, а не для изменения (в т.ч. расширения) самого контракта.