Я также работал над этой проблемой, которую я бы описал как «невозможно получить доступ к атрибуту коллекции продукта в плоском режиме» или «addAttributeToSelect не работает в плоском режиме».
Я нашел «чистое» решениекоторый:
- не требует, чтобы у атрибута были определенные настройки в админке (он может быть добавлен пользователем или скрыт в интерфейсе)
- работает как для плоских, так и не-плоский режим
Обратите внимание - в приведенном ниже коде я использовал связанную коллекцию продуктов, но это относится к любой коллекции продуктов (в частности, ко всем, что унаследовано от Mage_Eav_Model_Entity_Collection_Abstract
)
Код ошибки:
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
->addAttributeToSelect( 'my_custom_attribute' )
;
В плоском режиме приведенный выше код молча не может добавить атрибут, если его нет в плоской таблице.
Рабочий код:
$_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
.
(протестировано в CE 1.6.2.0)