Я делаю следующее:
$productCollection = Mage::getModel('catalog/product')
->getCollection();
$productCollection
->addAttributeToFilter('my_attribute', 1);
my_attribute
отсутствует в плоских таблицах, но плоские таблицы включены.
Я продолжаю получать полную коллекцию.
Причина, кажется, в \Mage_Catalog_Model_Resource_Product_Collection::addAttributeToSelect
:
$columns = $this->getEntity()->getAttributeForSelect($attributeCode);
Нет $this->getEntity()
- это экземпляр, Mage_Catalog_Model_Resource_Product_Flat
который выбирает плоские поля - и если ничего не найдено, просто возвращает ноль.
Как правильно добавить неплоский атрибут в фильтр коллекции?
В моем случае не имеет смысла добавлять атрибут к плоской таблице.
ce-1.7.0.2
collection
Alex
источник
источник
non-flat attribute
? Спасибо. И не делайте magento Запутывающим. Это уже сбивает с толкуОтветы:
Вы можете присоединиться к нужному столу самостоятельно.
Вы можете присоединиться к store_id тоже.
источник
Хак (CE 1.6.2.0+) состоит в том, чтобы передать условие как массив и верить этому или нет, это работает как задумано:
источник
addFieldToFiler
является оберткой дляaddAttributeToFilter
и имеет возможность передать атрибут в виде массива:if (is_array($attribute)) { $sqlArr = array(); foreach ($attribute as $condition) { $sqlArr[] = $this->_getAttributeConditionSql($condition['attribute'], $condition, $joinType); } $conditionSql = '('.implode(') OR (', $sqlArr).')'; }
Причина ответ ColinM работает из - за код в
app/code/core/Mage/Catalog/Model/Resource/Product/Collection.php
«saddAttributeToFilter
метода. Если вы используете этот формат массива, он не вызываетaddAttributeToSelect
. В плоском режимеaddAttributeToSelect
молча происходит сбой, если атрибут не находится в плоской таблице.(ниже приведена перефразировка моего ответа на /programming/6271284/can-i-add-other-attributes-to-magentos-flat-product-catalog-table/17021620 - я не уверен, что этикета для этого, но знаю, я бы нашел это полезным)
Я хотел «чистое» решение для выбора и фильтрации коллекций в плоском режиме по неплоским атрибутам, которое:
Я использовал связанную коллекцию продуктов, но это относится к любой коллекции EAV.
Неверный код:
В плоском режиме приведенный выше код молча не может выбрать или отфильтровать атрибут, если он не находится в плоской таблице.
Добавление в избранное:
joinAttribute
Метод добавляет присоединиться к запросу для атрибута конкретного запрошенного. Это все еще работает, когда атрибут уже находится в плоской таблице, но будет немного менее эффективным, чем просто использование плоской таблицы.Я использовал
left
соединение, чтобы убедиться, что оно выбирает продукты, если ониmy_custom_attribute
не установлены. Измените это,inner
если вас интересуют только те строки, где ониmy_custom_attribute
установлены.Добавление к фильтру (согласно ColinM выше):
Приведенный выше код добавит его в список, а также подчиняется вашему фильтру.
(протестировано в CE 1.6.2.0)
источник
В
Mage_Rss
модуле они использовали hacky-метод для отключения плоских таблиц. Они используют тот факт, что плоские таблицы всегда отключены в хранилище администратора и поэтому просто эмулируют хранилище администратора.После запуска эмуляции вы должны сбросить его
emulationModel->stopEnvironmentEmulation()
источник
когда вы создаете атрибут, он должен быть на глобальном уровне и быть фильтруемым. Таким образом, он будет использоваться в многоуровневой навигации. Также это потребует, чтобы атрибут был выпадающим или множественным выбором. Я бы лично посоветовал не менять основные файлы в соответствии с вашими потребностями в этом случае.
источник