:::: MENU ::::

Magento: Filtrar colección de productos

Magento: Filtrar colección de productos
3 votos, 4.67 media (86% puntos)

Colección con todos los productos en Magento

Con la siguiente colección podemos obtener todos los productos de nuestra tienda Magento:

  $collection = Mage::getModel('catalog/product')->getCollection();

Colección de productos filtrada por atributo simple en Magento

Si queremos filtrar la colección por un atributo simple (de texto, no dropdown o multiselect), como el nombre de un producto, el SKU, marca o similares, podemos utilizar:

  $collection = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToSelect('sku')
    ->addAttributeToSelect('name')
    ->addAttributeToFilter('name', array('like' => '%' . $nombre . '%'));

Las funciones de filtrado, pueden ser otras como: eq, neq, like, nlike, gt, lt, gteq, lteq.

También podemos pasar arrays a la función de filtrado para las funciones in o nin, según el siguiente modelo:

  $collection = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToSelect('sku')
    ->addAttributeToSelect('name')
    ->addAttributeToFilter('id', array('in' => array(1,4,98));

Colección de productos según atributo Dropdown o Multiselect en Magento

Según indicábamos en el tutotial Filtrar productos por fabricante en Magento en el caso de atributos dropdown o multiselect, no podemos utilizar los valores textuales para consultar la base de datos, sino que tenemos que pasar el identificador de la opción.

Dicho identificador se puede obtener, por ejemplo si tenemos un atributo marca o fabricante, de la siguiente forma:

$marca = Mage::getResourceModel('catalog/product')
                  ->getAttribute('manufacturer')
                  ->getSource()
                  ->getOptionId('Ray ban');

Una vez tenemos el identificador de la opción u opciones, podemos utilizarlo en el filtro de la colección de la forma habitual:

  $collection = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToSelect('sku')
    ->addAttributeToSelect('name')
    ->addAttributeToFilter('manufacturer', array('eq' => $marca);

Colección de productos según varios atributos en Magento

Podemos complicarlo un poco más y querer obtener la colección de productos que tengan dos o más caracteristicas (AND). En el ejemplo siguiente obtenemos la lista de productos con el SKU y nombre similares a los inidicados (ambas condiciones deben cumplirse)

$collection = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToSelect('sku')
    ->addAttributeToSelect('name')
    ->addAttributeToFilter('sku', array('like' => '%2822%'))
    ->addAttributeToFilter('name', array('like' => '%Ray Ban%'));

También podemos tener el caso de necesitar una u otra condición (OR). En ese caso y repitiendo el ejemplo anterior, tendríamos que escribir los filtros de la siguiente forma:

   $collection = Mage::getModel('catalog/product')->getCollection()
      ->addAttributeToSelect('name')
      ->addAttributeToSort('name', 'ASC')
      ->addAttributeToFilter('sku', array(array('like' => '%2823%'), array('eq' => '2822-8')));

Y si necesitamos una condición OR, pero con diferentes atributos:

   $collection = Mage::getModel('catalog/product')->getCollection()
      ->addAttributeToSelect('name')
      ->addAttributeToFilter(array(array('attribute' => 'sku', 'like' => '%2823%'),
                                   array('attribute' => 'name', 'like' => '%0RB3268%')));

Lista de productos de un tipo en Magento

Si queremos obtener la colección de todos los productos simples, configurables, agrupados, etc. de nuestra tienda Magento, podemos hacerlo de la siguiente forma:

   $collection = Mage::getModel('catalog/product')->getCollection()
      ->addAttributeToSelect('name')
      ->addAttributeToFilter('type_id', array('eq' => 'configurable'));

Colección de productos habilitados en Magento

Para filtrar la colección de productos y obtener únicamente aquellos productos activos en la tienda (habilitados), tendremos que añadir el siguiente filtro:

   $collection = Mage::getModel('catalog/product')->getCollection()
      ->addAttributeToSelect('name')
      ->addFieldToFilter('status', Mage_Catalog_Model_Product_Status::STATUS_ENABLED);



2 Comments

  • Responder Andres |

    Como puedo obtener por ejemplo solo 300 productos de esa colección, para hacer un update del inventario, y despues obtener los siguientes 300 productos para seguir con el update?

    • Responder Daniel Navarro Murillo |

      Para limitar los resultados de la colección, puedes utilizar dos parámetros más:

      $collection->setPageSize(300);
      $collection->setCurPage(1);

      El primero limita los resultados a 300 productos. El segundo indica la página que quieres obtener:

      setCurPage(1) te devuelve los productos del 0 al 299
      setCurPage(2) te devuelve los productos del 300 al 599
      etc.

Hey! Qué opinas sobre el artículo?