La razón por la que la respuesta de ColinM funciona se debe al código app/code/core/Mage/Catalog/Model/Resource/Product/Collection.phpdel addAttributeToFiltermétodo. Si usa este formato de matriz, no llama addAttributeToSelect. En modo plano, addAttributeToSelectfalla silenciosamente si el atributo no está en la tabla plana.
(a continuación se muestra un resumen de mi respuesta en /programming/6271284/can-i-add-other-attributes-to-magentos-flat-product-catalog-table/17021620 - Estoy no estoy seguro de cuál es la etiqueta para eso, pero sé que lo habría encontrado útil)
Quería una solución "limpia" para seleccionar y filtrar colecciones en modo plano en atributos no planos, que:
- no requiere que el atributo tenga configuraciones específicas en admin (puede ser agregado por un usuario u oculto en el front-end)
- funciona tanto en modo plano como no plano
Utilicé la colección de productos asociada, pero esto se aplica a cualquier colección de EAV.
Código de falla:
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
->addAttributeToSelect( 'my_custom_attribute' )
->addAttributeToFilter( 'my_custom_attribute', 3 )
;
En modo plano, el código anterior no puede seleccionar o filtrar silenciosamente el atributo si no está en la tabla plana.
Agregando a la selección:
$_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' )
;
los joinAttribute método agrega una unión a la consulta para el atributo específico solicitado. Todavía funciona cuando el atributo ya está en la tabla plana, pero será un poco menos eficiente que usar la tabla plana.
He usado una leftcombinación allí, para asegurarme de que obtenga productos si my_custom_attributeno está configurado en esos productos. Cambie eso innersi solo le interesan las filas donde my_custom_attributeestá configurado.
Agregando al filtro (según ColinM arriba):
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
->addAttributeToFilter( array( array( 'attribute' => 'my_custom_attribute', 'eq' => 3 ) ) )
;
El código anterior lo agregará a la selección y obedecerá su filtro.
(probado en CE 1.6.2.0)
non-flat attribute? Gracias. Y no hagáis magento confuso. Ya es confuso