2009-11-20 10 views
10

Al utilizar el método de recopilación de Magento, addFieldToFilter ¿es posible permitir el filtrado por valores NULL? Quiero seleccionar todos los productos de una colección que tengan un atributo personalizado, incluso si no se asigna ningún valor al atributo.Magento addFieldToFilter allow NULLs

Respuesta

1

No necesita utilizar addFieldToFilter.

ahora la solución:
atributos nombre se conoce como code en Magento, sólo tiene que utilizar el código de abajo para conseguir todos los productos que tienen un atributo específico como una matriz

 

$prodsArray=Mage::getModel('catalog/product')->getCollection() 
            ->addAttributeToFilter('custom_attribute_code') 
            ->getItems(); 
 

también puede especificar ciertas condiciones para el valor del atributo en addAttributeToFilter en el segundo parámetro de addAttributeToFilter.

puede encontrar este método en este archivo (queda en estudio):

app/code/core/Mage/Eav/Model/Entity/Collection/Abstract.php 
+0

Gracias por señalar addFieldToFilter - que condujo a la solución de manejo de fie NULL lds – leepowers

+0

esto es realmente incorrecto, esto hará una comparación con un filtro vacío en lugar de un filtro nulo. – useless

18

Filtrado de una colección de productos por atributos nulos/vacíos tiene dos soluciones posibles. Magento usa INNER JOIN para tomar los valores de los atributos para filtrar. PERO si al atributo de producto no se le asigna un valor, la unión fallará, ya que falta una tabla/relación de base de datos.

Solución # 1: Uso addAttributeToFilter() y cambie el tipo de combinación de "interior" (por defecto) a "izquierda":

$collection = Mage::getModel('catalog/product')->getCollection(); 
$collection->addAttributeToFilter('custom_attribute', array(... condition options ..), 'left'); 

Solución # 2: Asegúrese de que el atributo personalizado tiene un valor predeterminado Magento es conservador en este sentido. Magento solo creará la relación entre un atributo y un producto si se otorga un valor para el atributo. Por lo tanto, en ausencia de un valor especificado por el usuario o un valor predeterminado, el atributo no será accesible para filtrar un producto , incluso si el atributo aparece en la vista de detalles del producto en el panel de administración.

+3

estrategia de unión a la izquierda funcionó muy bien. Parece que esta respuesta es bastante antigua, ¡pero debo decir gracias de todos modos! – shaune

+1

La combinación izquierda es un atributo obligatorio al agarrar, IMO. – Nick

49

Veo que ya ha encontrado una solución, pero también hay esta opción:

$collection->addFieldToFilter('parent_item_id', array('null' => true)); 

Pero si desea utilizar "NULO" => false, lo que no funciona. (y me di cuenta de que puede utilizar elementos tales como "en", "nin", "eq", "NEQ", "GT"), usted puede hacer esto:

$collection->addFieldToFilter('parent_item_id', array('neq' => 'NULL')); 

Hope esto sigue siendo útil. ..

+4

Consulte la documentación en el código de Varien_Data_Collection_Db :: _ getConditionSql(). Describe todas las opciones que son posibles, como el mencionado 'nulo', pero también 'notnull' para el reverso. – fietserwin

20

Esto funciona por no filtros NULL

$collection->addFieldToFilter('parent_item_id', array('notnull' => true)); 
1

Debido a que la cuestión no coincide exactamente con el título de la pregunta y me encontré con la de ellos varias veces por la búsqueda de una condición como: valor especial o NULL

Si desea filtrar una colección a juego un valor o NULL, entonces usted puede utilizar:

$collection->addFieldToFilter('<attribute>', array(
    array('eq' => '<value>'), 
    array('null' => true) 
)); 
Cuestiones relacionadas