The reason ColinM's answer works is due to the code in app/code/core/Mage/Catalog/Model/Resource/Product/Collection.php
's addAttributeToFilter
method. If you use this array format, it doesn't call addAttributeToSelect
. In flat mode, addAttributeToSelect
silently fails if the attribute is not in the flat table.
(below is a re-hash of my answer on https://stackoverflow.com/questions/6271284/can-i-add-other-attributes-to-magentos-flat-product-catalog-table/17021620 - I'm not sure what the etiquette is for that but know I would've found it helpful)
I wanted a "clean" solution for flat-mode collection selecting and filtering on non-flat attributes, which:
- does not require the attribute to have specific settings in admin (it might be added by a user, or hidden on the front end)
- works for both flat and non-flat mode
I used the associated product collection, but this applies to any EAV collection.
Failing code:
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
->addAttributeToSelect( 'my_custom_attribute' )
->addAttributeToFilter( 'my_custom_attribute', 3 )
;
In flat mode, the above code silently fails to select or filter on the attribute if it happens not to be in the flat table.
Adding to the select:
$_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
method adds a join to the query for the specific attribute requested. It still works when the attribute is already in the flat table, but will be slightly less efficient than purely using the flat table.
I've used a left
join there, to ensure that it fetches products if my_custom_attribute
is not set on those products. Change that for inner
if you're only interested in rows where my_custom_attribute
is set.
Adding to the filter (as per ColinM above):
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
->addAttributeToFilter( array( array( 'attribute' => 'my_custom_attribute', 'eq' => 3 ) ) )
;
The above code will add it to the select as well as obeying your filter.
(tested in CE 1.6.2.0)
non-flat attribute
? Thanks .and dont make magento Confusing .It is already confusing