magento
Cómo filtrar colecciones
Buscar..
Parámetros
Parámetro | Detalles |
---|---|
$ addFieldToFilter ( $ field , $ condition = null) | {string} El campo que estamos agregando al filtro. |
$ addFieldToFilter ($ field, $ condition = null ) | {mixed} La definición del filtro que usaremos. |
addAttributeToFilter ( $ attr , $ condition = null, $ join = 'inner') | {string} El campo que estamos agregando al filtro. |
addAttributeToFilter ($ attr, $ condition = null , $ join = 'inner') | {mixed} La definición del filtro que usaremos. |
addAttributeToFilter ($ attr, $ condition = null, $ join = 'inner' ) | {('inner', 'left')} El tipo de unión sql que se usará al unirse a la tabla EAV. |
Observaciones
Argumentos de comparación de filtros
Magento también ofrece una forma flexible de filtrar utilizando operadores de comparación también. Aquí hay una lista de operadores válidos y su sintaxis:
Todos los argumentos de comparación se pueden pasar al segundo parámetro de los addFieldToFielter()
o addAttributeToFilter()
.
$collection_of_products->addAttributeToFilter('visible',array("eq"=>1));
Comparación | Matriz de argumentos | Fragmento de SQL resultante |
---|---|---|
Es igual a | array ("eq" => $ var) | DONDE (`my_field` = $ var) |
No es igual | array ("neq" => $ var) | DONDE (`my_field`! = $ Var) |
Me gusta | array ("like" => $ var) | DONDE (`my_field` ME GUSTA $ var) |
Diferente a | array ("nlike" => $ var) | DONDE (`my_field` NO ME GUSTA $ var) |
Es | array ("is" => $ var) | DONDE (`my_field` IS $ var) |
En | array ("in" => $ var) | DONDE (`my_field` IN ($ var)) |
No en | array ("nin" => $ var) | DONDE (`my_field` NO EN ($ var)) |
Nulo | array ("null" => true) | DONDE (`my_field` ES NULL) |
No nulo | array ("notnull" => true) | DONDE (`my_field` NO ES NULO) |
Mas grande que | array ("gt" => $ var) | DONDE (`my_field`> $ var) |
Menos que | array ("lt" => $ var) | DONDE (`my_field` <$ var) |
Mayor que o igual | array ("gteq" => $ var) | DONDE (`my_field`> = $ var) |
Menor o igual | array ("lteq" => $ var) | DONDE (`my_field` <= $ var) |
Encontrar en set | array ("finset" => array ($ var)) | DONDE (find_in_set ($ var, `my_field`) |
Desde y hacia | array ("from" => $ var1, "to" => $ var2) | DONDE (`my_field`> = $ var1 Y` my_field` <= $ var2) |
Filtrando colecciones
Magento tiene un poderoso conjunto de métodos para filtrar colecciones. Como hay dos tipos de Objetos que pueden estar contenidos en colecciones, primero debemos determinar con qué tipo de datos estamos trabajando antes de poder filtrarlos. Magento implementa un modelo de datos EAV para entidades como productos y categorías. Existe un conjunto diferente de métodos a utilizar si estamos filtrando una colección de Objetos EAV.
En Magento, los pedidos no se almacenan como objetos EAV. Esto hace que la colección de pedidos sea un buen ejemplo para filtrar una colección básica.
$collection_of_orders = Mage::getModel('sales/order')->getCollection();
$collection_of_orders->addFieldToFilter('status','processing');
Si observamos la colección de productos, podemos ver que los productos están almacenados en un modelo de datos EAV. También podemos filtrar fácilmente por atributos de EAV.
$collection_of_products = Mage::getModel('catalog/product')->getCollection();
$collection_of_products->addAttributeToFilter('visible',1);
Manejo de ANDs y ORs en Filtros
Cuando consultamos nuestros datos, a menudo necesitamos más de un filtro para obtener el conjunto de datos exacto que estamos buscando. En SQL, manejamos esto con cláusulas AND y OR. Podemos lograr lo mismo con las colecciones.
Para agregar una cláusula AND a su consulta, simplemente agregue otro método de llamada. Esto agregará el segundo filtro a la declaración WHERE original que lo une con un AND.
Mage::getModel('catalog/product')->getCollection()
->addFieldToFilter('sku',array('like'=>'a%'))
->addFieldToFilter('sku',array('like'=>'%b'));
La cláusula WHERE resultante se verá así:
WHERE (e.sku like 'a%') AND (e.sku like '%b')
Ahora digamos que queremos que todos los skus que comiencen con 'a' O terminen con 'b'. ¿Cómo agregamos una cláusula OR? Gracias a las colecciones de Magento, es bastante sencillo. Añadimos el filtro como un segundo elemento en la matriz de filtros.
Mage::getModel('catalog/product')->getCollection()
->addFieldToFilter('sku', array(
array('like'=>'a%'),
array('like'=>'%b')
));
Ahora, la cláusula WHERE resultante se verá así:
WHERE (((e.sku like 'a%') or (e.sku like '%b')))