Condicionales múltiples (OR y AND dentro de AND) en addAttributeToFilter


19

¿Cómo crear una condición múltiple en addAttributeToFilter?

Quiero resultado en una consulta SQL como esta (imagen adjunta):

WHERE ((`e`.`news_from_date` > '2013-09-12') OR (`e`.`news_to_date` < '2013-09-12'))
AND ((((`e`.`special_price` IS NULL))) OR (((`e`.`special_price` IS NOT NULL)) AND ((`e`.`special_from_date` < '2013-09-12') OR (`e`.`special_to_date` > '2013-09-12'))))

$collection->addAttributeToFilter('special_price', array('null'=>'special_price'), 'left');

Graciasingrese la descripción de la imagen aquí


Esto me pareció muy útil: blog.chapagain.com.np/…
nicolallias

Respuestas:


41

Debería poder combinar la mayoría de estas técnicas para crear la consulta que desee. Para las tablas de ventas, probablemente usará addFieldToFilter, pero Zend_Db_Expres probable que sea el camino de menor resistencia para usted:

addAttributeToFilter:

De acuerdo con el Wiki de Magento : Al crear paréntesis que tengan ORcondiciones, puede hacer lo siguiente:

Si se pasa una matriz pero no se especifica ningún código de atributo, se interpretará como un grupo de condiciones OR que se procesarán de la misma manera.

Entonces, a partir de eso podemos construir lo siguiente:

$collection->addAttributeToFilter(
    array(
        array('attribute'=> 'someattribute','like' => 'value'),
        array('attribute'=> 'otherattribute','like' => 'value'),
        array('attribute'=> 'anotherattribute','like' => 'value'),
    )
);

Esto generará una WHEREcláusula del formato:

WHERE ((someattribute LIKE 'value') OR (otherattribute LIKE 'value') OR (anotherattribute LIKE 'value'))

addFieldToFilter:

En el caso de que el modelo esté directamente vinculado a una tabla DB, se requiere lo siguiente para aplicar condicionales a la columna de la base de datos por su nombre:

$collection->addFieldToFilter(
    array('title', 'content'),
    array(
        array('like'=>'%$titlesearchtext%'), 
        array('like'=>'%$contentsearchtext%')
    )
)

Zend_Db_Expr:

Para construcciones mucho más complicadas, puede construir su propia cláusula where utilizando Zend_Db_Expr. Por ejemplo :

$collection->getSelect()->where(new Zend_Db_Expr("(e.created_at > '2013-01-01 00:00:00' OR e.created_at <'2012-01-01 00:00:00)"));

Fuente :

/programming/5301231/addattributetofilter-and-or-condition-in-magentos-collection

/programming/3826474/magento-addfieldtofilter-two-fields-match-as-or-not-and/7851884#7851884


Gracias por su respuesta, pero lo que quiero es hacer una condición como: WHERE (CONDITION_1 OR (CONDITION_2 AND (CONDITION_3 OR CONDITION_4))). Ya publico la consulta que quiero arriba.
Andhi Irawan

1
Pensé que había dicho que puedes usar Zend_Db_Expr:$collection->getSelect()->where(new Zend_Db_Expr("(CONDITION_1 OR (CONDITION_2 AND (CONDITION_3 OR CONDITION_4)))"));
philwinkle

gracias philwinkle.base en su respuesta, esta es una muestra de lo que hice con addAttributeToFilter y la condición AND y OR: pastebin.com/ZznxLAai
Andhi Irawan

¿Hay alguna manera de determinar qué atributo produjo un resultado? Estoy buscando una colección de modelos personalizados a través de tres campos ( name, altnernate_name, description) y me gustaría saber cuando un resultado es debido al descriptionatributo.
pspahn

4

Si desea incluir AND con la combinación de OR, entonces

$colemanManufacturerSku = Mage::getResourceModel('catalog/product_collection')
    ->addAttributeToSelect('sku')
    ->addAttributeToSelect('sku_1')
    ->addAttributeToSelect('sku_2')
    ->addAttributeToSelect('sku_3')
    ->addAttributeToFilter('type_id', array('eq' => 'simple'))
    // Above condition will AND with following OR
    ->addAttributeToFilter(
        array(
            array(
                'attribute' => 'sku_1',
                'neq' => ''
            ),
            array(
                'attribute' => 'sku_2',
                'neq' => ''
            ),
            array(
                'attribute' => 'sku_3',
                'neq' => ''
            )
        )
    );

2
+1 para su solución, pero necesito exactamente lo contrario, es decir, DÓNDE (CONDICIÓN_1 Y CONDICIÓN_2) O (CONDICIÓN_3 Y CONDICIÓN_4))), ¿pueden ayudarme?
Haris

1

O condición usando addFieldToFilter


$collection->addFieldToFilter
                (   
                    array('email','mobile'),
                    array($emaiId,$mobNum)
                );

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.