Причина ответ ColinM работает из - за код в app/code/core/Mage/Catalog/Model/Resource/Product/Collection.php
«s addAttributeToFilter
метода. Если вы используете этот формат массива, он не вызывает addAttributeToSelect
. В плоском режиме addAttributeToSelect
молча происходит сбой, если атрибут не находится в плоской таблице.
(ниже приведена перефразировка моего ответа на /programming/6271284/can-i-add-other-attributes-to-magentos-flat-product-catalog-table/17021620 - я не уверен, что этикета для этого, но знаю, я бы нашел это полезным)
Я хотел «чистое» решение для выбора и фильтрации коллекций в плоском режиме по неплоским атрибутам, которое:
- не требует, чтобы у атрибута были определенные настройки в админке (он может быть добавлен пользователем или скрыт в интерфейсе)
- работает как в плоском, так и в неплоском режиме
Я использовал связанную коллекцию продуктов, но это относится к любой коллекции EAV.
Неверный код:
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
->addAttributeToSelect( 'my_custom_attribute' )
->addAttributeToFilter( 'my_custom_attribute', 3 )
;
В плоском режиме приведенный выше код молча не может выбрать или отфильтровать атрибут, если он не находится в плоской таблице.
Добавление в избранное:
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
->joinAttribute( 'my_custom_attribute', 'catalog_product/my_custom_attribute', 'entity_id', null, 'left' )
->addAttributeToSelect( 'my_custom_attribute' )
;
joinAttribute
Метод добавляет присоединиться к запросу для атрибута конкретного запрошенного. Это все еще работает, когда атрибут уже находится в плоской таблице, но будет немного менее эффективным, чем просто использование плоской таблицы.
Я использовал left
соединение, чтобы убедиться, что оно выбирает продукты, если они my_custom_attribute
не установлены. Измените это, inner
если вас интересуют только те строки, где они my_custom_attribute
установлены.
Добавление к фильтру (согласно ColinM выше):
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
->addAttributeToFilter( array( array( 'attribute' => 'my_custom_attribute', 'eq' => 3 ) ) )
;
Приведенный выше код добавит его в список, а также подчиняется вашему фильтру.
(протестировано в CE 1.6.2.0)
non-flat attribute
? Спасибо. И не делайте magento Запутывающим. Это уже сбивает с толку