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.php
del addAttributeToFilter
método. Si usa este formato de matriz, no llama addAttributeToSelect
. En modo plano, addAttributeToSelect
falla 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 left
combinación allí, para asegurarme de que obtenga productos si my_custom_attribute
no está configurado en esos productos. Cambie eso inner
si solo le interesan las filas donde my_custom_attribute
está 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