Причина відповідь 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' )
;
The 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
? Дякую. І не робіть магенто заплутаним. Це вже заплутано