Estoy haciendo lo siguiente:
$productCollection = Mage::getModel('catalog/product')
->getCollection();
$productCollection
->addAttributeToFilter('my_attribute', 1);
my_attribute
no está en las tablas planas, pero las tablas planas están habilitadas.
Sigo recibiendo la colección completa.
La razón parece estar en \Mage_Catalog_Model_Resource_Product_Collection::addAttributeToSelect
:
$columns = $this->getEntity()->getAttributeForSelect($attributeCode);
No $this->getEntity()
es una instancia de la Mage_Catalog_Model_Resource_Product_Flat
que se obtienen los campos planos, y si no se encuentra ninguno, solo devuelve nulo.
¿Cuál es una forma limpia de agregar un atributo no plano al filtro de colección?
En mi caso no tiene sentido agregar el atributo a la tabla plana.
ce-1.7.0.2
collection
Alex
fuente
fuente
non-flat attribute
? Gracias. Y no hagáis magento confuso. Ya es confusoRespuestas:
Puedes unirte a la mesa necesaria tú mismo.
Es posible que desee unirse por store_id, también.
fuente
Un truco (CE 1.6.2.0+) es pasar la condición como una matriz y creerlo o no, esto funciona según lo previsto:
fuente
addFieldToFiler
es un contenedoraddAttributeToFilter
y tiene una opción para pasar el atributo como una matriz:if (is_array($attribute)) { $sqlArr = array(); foreach ($attribute as $condition) { $sqlArr[] = $this->_getAttributeConditionSql($condition['attribute'], $condition, $joinType); } $conditionSql = '('.implode(') OR (', $sqlArr).')'; }
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
deladdAttributeToFilter
método. Si usa este formato de matriz, no llamaaddAttributeToSelect
. 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:
Utilicé la colección de productos asociada, pero esto se aplica a cualquier colección de EAV.
Código de falla:
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:
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 simy_custom_attribute
no está configurado en esos productos. Cambie esoinner
si solo le interesan las filas dondemy_custom_attribute
está configurado.Agregando al filtro (según ColinM arriba):
El código anterior lo agregará a la selección y obedecerá su filtro.
(probado en CE 1.6.2.0)
fuente
En el
Mage_Rss
módulo utilizaron el método hacky para deshabilitar las tablas planas. Utilizan el hecho de que las tablas planas siempre están apagadas en la tienda de administración y, por lo tanto, simplemente emulan la tienda de administración.Después de comenzar la emulación, debe restablecerla con
emulationModel->stopEnvironmentEmulation()
fuente
cuando crea el atributo, debe estar en el nivel Global y ser filtrable. De esta manera será utilizable en la navegación en capas. También requerirá que el atributo sea desplegable o multiseleccionado. Yo personalmente recomendaría no cambiar los archivos principales para satisfacer sus necesidades en este caso
fuente