В моем веб-приложении MVC я обнаружил, что выполняю множество действий с ActiveRecords, где я извлекаю определенное подмножество продуктов из базы данных (скажем, для поискового запроса), а затем снова перебираю для отображения каждый - но для отображения каждого требуется еще несколько поездок в базу данных, чтобы получить такие вещи, как цена, кто их поставляет, и различные другие части метаданных. Вычислить каждую из этих частей метаданных не очень просто; на самом деле это не то, чего можно достичь простым JOIN. Однако было бы возможно (в любом случае для большинства из этих случаев) пакетировать требуемые вызовы базы данных и делать их все сразу перед циклом, а затем в цикле обращаться к этим предварительно выбранным данным для выполнения различных вычислений.
Так же, как пример типа вещи - в поиске я мог бы захотеть узнать, из каких регионов поставляется продукт. В базе данных у меня есть различные строки, которые представляют запасы этого товара у конкретного поставщика, и я могу просмотреть всех различных поставщиков, которые поставляют этот товар, а затем получить все регионы, поставленные этими поставщиками. Это хорошо вписывается в один запрос, но может стать немного сложным, чтобы присоединиться к поиску оригинального продукта (не так ли?).
У меня два вопроса:
Кто-нибудь еще делает что-то подобное, и это звучит как хороший способ справиться с проблемой? Или это больше похоже на проблему проектирования (возможно, приложение выросло из полезности ActiveRecord, или, например, модели нужно разделить и объединить различными способами).
Если я сделаю предварительную выборку множества разных вещей, которые, как мне кажется, я буду использовать внутри цикла, мне будет трудно решить, как лучше всего передать соответствующие данные в модель , В данный момент я использую статический метод в модели для извлечения всех данных, которые мне нужны в начале массива, например fetchRegionsForProductIds(array $ids)
и т. Д .; эти методы возвращают массив с ключом идентификатора продукта, поэтому, когда я работаю в цикле, я могу получить регионы для текущего продукта и передать их в качестве параметра методу модели, который нуждается в них. Но это кажется немного хакерским и трудоемким для меня. Итак, может кто-нибудь сказать мне, есть ли какой-то действительно очевидный и красивый шаблон дизайна, который я пропускаю, который мог бы полностью решить эту проблему для меня, или это просто какая-то сложная проблема, которая нуждается в некрасивом сложном решении?
Небольшое обновление: интересно, если использование класса datamapper поставит меня на правильный путь? Существует ли распространенный способ реализации средства отображения данных, чтобы можно было заранее выполнить большие пакетные запросы, сохранить эту информацию в массиве, а затем передать ее в записи по мере их запроса?
Я действительно надеюсь, что этот вопрос имеет смысл; Я сделал все возможное, чтобы прояснить ситуацию, и с радостью добавлю больше подробностей, если кто-то думает, что он может попробовать это!