Вопрос не очень понятен. Если проблема в том что для получения различных данных требуется один и тот же запрос, то разумеется не нужно этот запрос дублировать. Запрос будет один, и "репозиторий" будет выполнять его с разными входящими данными.
Правда, традиционно "файл с SQL запросами" обычно называется репозиторием , а "репозиторий" - сервисом или хелпером.
В общем, нормальная структура такая
1. Класс "запросы в БД". "Подтягивает" к себе соединение с с БД
2. Класс репозиторий. Подтягивает к себе класс "запросы в БД". Каждый метод возвращает структуру данных, очень условно говоря - "модель".
3. Контроллер выполняет методы репозитория, получая "модели", и формируя "переменные" на основании данных из этих "моделей". При этом
СОВСЕМ не обязательно чтобы одной "переменной" соответствовала одна "модель", а для каждой "модели" писался свой запрос.
Модель может содержать сразу много переменных. Например агрегирующие можели могут сразу возвращать и среднее и максимальное и и манимальное значение. А контроллер уже решит акое ему надо
Самое главное, запросы можно формировать
динамически! Если у тебя запрос который выводит данные за все время, к нему
просто добавить условие, что если в метод репозитория переданы даты, то к запросу добавляется выборка по датам. И сразу получается что метод в репозитории один!
То же самое касается и других условий. Надо только синие утюги? Нет проблем -
в тот же самый метод добавляется проверка на наличие цвета в условиях и если есть - это условие добавляется в запрос.
то есть запросы
SELECT count(field) FROM table WHERE a<100;
SELECT count(field) FROM table WHERE a=1 AND field_1 = 'd';
SELECT count(field) FROM table WHERE a=1 AND field_1 = 'd' and date between 2019 and 2020;
это
ОДИН метод