Оттолкнуться от того что пользователь может передать (порядок важен везде, как задали - так и ищем)
- фильтры (как правило массив критериев [ [ 'hello', 'like', 'world*' ], [ 'item', '>', 100 ] ])
-- фильтры типа И/ИЛИ/НЕ - как правило отправляются в один уровень, либо вложенным массивом с ключами [ y => [filter,filter], n => [ y => [filter, filter], 'n' => [ filter ] ];
- сортировку (как правило массив из массивов [ [ 'hello', 'asc' ], [ 'item', 'desc' ] ]
- лимит записей
- отступ от начала таблицы
- номер страницы (отступ = лимит умножить на (номер-1))
В твоем случае он может передать еще источник данных - где искать "база такая то", таблица "такая то"
Потом написать обертку которая преобразует входящий GET запрос из массива в некий объект который знает про все вышеперечисленное чтобы дальше его передавать.
Дальше этот объект передается в некий класс, который умеет искать по источнику данных. Репозиторий. И там делаются функции findByCriteria(Criteria $criteria) во все источники данных - где-то в апишку, где-то в базу, где-то в одну таблицу, где-то в другую.
Задачка которую решает каждый разработчик на ПХП. А единого решения так и нет.
Причем это не разу не легкая задачка если её видеть в том виде как автор написал.
Если задача просто из таблицы по условию выдрать - то она упрощается. Не в 2 раза. А в сто-два.
У архитекторов конечно есть. Иначе они бы не считали себя архитекторами. Но тебе они не дадут. Иначе ты тоже станешь архитектором, а так нельзя.