La colección Magento tiene dos métodos para filtrar abajo diferentes
- Varien_Data_Collection_Db :: addFieldToFilter
addFieldToFilter ($ campo, $ condición = nulo)
El primer parámetro de addFieldToFilter
es el atributo por el que desea filtrar. El segundo es el valor que estás buscando. Aquí estamos agregando un sku
filtro para el valor n2610
.
El segundo parámetro también se puede usar para especificar el tipo de filtrado que desea hacer. Aquí es donde las cosas se ponen un poco complicadas, y vale la pena profundizar un poco más.
Entonces, por defecto, lo siguiente
$collection_of_products->addFieldToFilter('sku','n2610');
es (esencialmente) equivalente a
WHERE sku = "n2610"
Echa un vistazo por ti mismo. Ejecutando lo siguiente
public function testAction()
{
var_dump(
(string)
Mage::getModel('catalog/product')
->getCollection()
->addFieldToFilter('sku','n2610')
->getSelect());
}
rendirá
SELECT `e`.* FROM `catalog_product_entity` AS `e` WHERE (e.sku = 'n2610')'
Tenga en cuenta que esto puede complicarse rápidamente si está utilizando un atributo EAV. Agregar un atributo
var_dump(
(string)
Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addFieldToFilter('meta_title','my title')
->getSelect()
);
y la consulta se vuelve retorcida.
SELECT `e`.*, IF(_table_meta_title.value_id>0, _table_meta_title.value, _table_meta_title_default.value) AS `meta_title`
FROM `catalog_product_entity` AS `e`
INNER JOIN `catalog_product_entity_varchar` AS `_table_meta_title_default`
ON (_table_meta_title_default.entity_id = e.entity_id) AND (_table_meta_title_default.attribute_id='103')
AND _table_meta_title_default.store_id=0
LEFT JOIN `catalog_product_entity_varchar` AS `_table_meta_title`
ON (_table_meta_title.entity_id = e.entity_id) AND (_table_meta_title.attribute_id='103')
AND (_table_meta_title.store_id='1')
WHERE (IF(_table_meta_title.value_id>0, _table_meta_title.value, _table_meta_title_default.value) = 'my title')
No para diferir el punto, pero trata de no pensar demasiado en el SQL si estás en la fecha límite.
Otros operadores de comparación Estoy seguro de que se está preguntando "¿y si quiero algo más que un igual por consulta"? No es igual, mayor que, menor que, etc. El segundo parámetro del método addFieldToFilter también lo cubre allí. Admite una sintaxis alternativa donde, en lugar de pasar una cadena, pasa una matriz de un solo elemento.
La clave de esta matriz es el tipo de comparación que desea hacer. El valor asociado con esa clave es el valor por el que desea filtrar. Vamos a rehacer el filtro anterior, pero con esta sintaxis explícita
public function testAction()
{
var_dump(
(string)
Mage::getModel('catalog/product')
->getCollection()
->addFieldToFilter('sku',array('eq'=>'n2610'))
->getSelect()
);
}
Llamando a nuestro filtro
addFieldToFilter('sku',array('eq'=>'n2610'))
Como puede ver, el segundo parámetro es una matriz de PHP. Su clave es eq, que significa igual. El valor de esta clave es n2610, que es el valor en el que estamos filtrando.
Magento tiene varios de estos filtros en inglés que traerán una lágrima de recuerdo (y tal vez dolorosa) a cualquier antiguo desarrollador de Perl en la audiencia.
A continuación se enumeran todos los filtros, junto con un ejemplo de sus equivalentes SQL.
array("eq"=>'n2610')
WHERE (e.sku = 'n2610')
array("neq"=>'n2610')
WHERE (e.sku != 'n2610')
array("like"=>'n2610')
WHERE (e.sku like 'n2610')
array("nlike"=>'n2610')
WHERE (e.sku not like 'n2610')
array("is"=>'n2610')
WHERE (e.sku is 'n2610')
array("in"=>array('n2610'))
WHERE (e.sku in ('n2610'))
array("nin"=>array('n2610'))
WHERE (e.sku not in ('n2610'))
array("notnull"=>'n2610')
WHERE (e.sku is NOT NULL)
array("null"=>'n2610')
WHERE (e.sku is NULL)
array("gt"=>'n2610')
WHERE (e.sku > 'n2610')
array("lt"=>'n2610')
WHERE (e.sku < 'n2610')
array("gteq"=>'n2610')
WHERE (e.sku >= 'n2610')
array("moreq"=>'n2610') //a weird, second way to do greater than equal
WHERE (e.sku >= 'n2610')
array("lteq"=>'n2610')
WHERE (e.sku <= 'n2610')
array("finset"=>array('n2610'))
WHERE (find_in_set('n2610',e.sku))
array('from'=>'10','to'=>'20')
WHERE e.sku >= '10' and e.sku <= '20'
La mayoría de estos se explican por sí mismos, pero algunos merecen un llamado especial
in, nin, find_in_set Los condicionales in y nin le permiten pasar una matriz de valores. Es decir, la porción de valor de su matriz de filtros puede ser una matriz.
array("in"=>array('n2610','ABC123')
WHERE (e.sku in ('n2610','ABC123'))
notnull, null La palabra clave NULL es especial en la mayoría de los tipos de SQL. Por lo general, no jugará bien con el operador de igualdad estándar (=). Si especifica notnull o null como su tipo de filtro, obtendrá la sintaxis correcta para una comparación NULL e ignorará cualquier valor que pase
array("notnull"=>'n2610')
WHERE (e.sku is NOT NULL)
from - to filter Este es otro formato especial que rompe la regla estándar. En lugar de una matriz de un solo elemento, especifique una matriz de dos elementos. Un elemento tiene la clave de, el otro elemento tiene la clave para. Como indican las teclas, este filtro le permite construir un rango desde / hasta sin tener que preocuparse por símbolos mayores o menores que
public function testAction
{
var_dump(
(string)
Mage::getModel('catalog/product')
->getCollection()
->addFieldToFilter('price',array('from'=>'10','to'=>'20'))
->getSelect()
);
}
Los rendimientos anteriores
WHERE (_table_price.value >= '10' and _table_price.value <= '20')'
AND u OR, o es eso OR y AND? Finalmente, llegamos a los operadores booleanos. Es el raro momento en el que solo estamos filtrando por un atributo. Afortunadamente, las colecciones de Magento nos tienen cubiertos. Puede encadenar varias llamadas a addFieldToFilter para obtener una serie de consultas "Y".
function testAction()
{
echo(
(string)
Mage::getModel('catalog/product')
->getCollection()
->addFieldToFilter('sku',array('like'=>'a%'))
->addFieldToFilter('sku',array('like'=>'b%'))
->getSelect()
);
}
Al encadenar varias llamadas como arriba, produciremos una cláusula where que se parece a la siguiente
WHERE (e.sku like 'a%') AND (e.sku like 'b%')
Para aquellos de ustedes que acaban de levantar la mano, sí, el ejemplo anterior siempre devolverá 0 registros. Ningún sku puede comenzar con AMBOS a a y a b. Lo que probablemente queremos aquí es una consulta OR. Esto nos lleva a otro aspecto confuso del segundo parámetro de addFieldToFilter.
Si desea crear una consulta OR, debe pasar una matriz de matrices de filtro como segundo parámetro. Creo que es mejor asignar sus matrices de filtro individuales a variables
public function testAction()
{
$filter_a = array('like'=>'a%');
$filter_b = array('like'=>'b%');
}
y luego asignar una matriz de todas mis variables de filtro
public function testAction()
{
$filter_a = array('like'=>'a%');
$filter_b = array('like'=>'b%');
echo(
(string)
Mage::getModel('catalog/product')
->getCollection()
->addFieldToFilter('sku',array($filter_a,$filter_b))
->getSelect()
);
}
En aras de ser explícito, aquí está la matriz de matrices de filtros mencionada anteriormente.
array($filter_a,$filter_b)
Esto nos dará una cláusula WHERE que se parece a la siguiente
WHERE (((e.sku like 'a%') or (e.sku like 'b%')))
- Varien_Data_Collection :: addFilter
addFilter($field, $value, $type = 'and')
addFilter()
solo permite filtrar un solo campo por un solo valor y un tipo. $type
puede ser cualquiera de:
- "y" (predeterminado): agrega AND $ field = $ value a la cláusula WHERE
- "o" - agrega "OR $ field = $ value a la cláusula WHERE
Ver más detalles
addFilter
conattributes
?