Multi condizionali (OR e AND all'interno di AND) in addAttributeToFilter


19

Come creare una multi-condizione in addAttributeToFilter?

Voglio ottenere una query SQL come questa (immagine allegata):

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');

Grazieinserisci qui la descrizione dell'immagine


L'ho trovato molto utile: blog.chapagain.com.np/…
nicolallias

Risposte:


41

Dovresti essere in grado di combinare la maggior parte di queste tecniche per creare la query desiderata. Per le tabelle di vendita, probabilmente utilizzerai addFieldToFilter, ma Zend_Db_Exprè probabilmente il percorso di minor resistenza per te:

addAttributeToFilter:

Secondo il Wiki Magento : Quando si creano parentesi che presentano ORcondizioni, è possibile effettuare le seguenti operazioni:

Se viene passato un array ma non viene specificato alcun codice di attributo, verrà interpretato come un gruppo di condizioni OR che verranno elaborate allo stesso modo.

Quindi, da ciò possiamo costruire quanto segue:

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

Ciò genererà una WHEREclausola del formato:

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

addFieldToFilter:

Nel caso in cui il modello sia direttamente collegato a una tabella DB, è necessario quanto segue per applicare condizionali alla colonna del database per nome:

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

Zend_Db_Expr:

Per costrutti molto più complicati puoi costruire la tua clausola where usando Zend_Db_Expr. Per esempio :

$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)"));

Fonte :

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

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


Grazie per la tua risposta, ma la cosa che voglio è creare condizioni come: WHERE (CONDITION_1 OR (CONDITION_2 AND (CONDITION_3 AND (CONDITION_3 OR CONDITION_4))). Pubblico già la query che desidero sopra.
Andhi Irawan,

1
Ho pensato di sottolineare che puoi usare Zend_Db_Expr:$collection->getSelect()->where(new Zend_Db_Expr("(CONDITION_1 OR (CONDITION_2 AND (CONDITION_3 OR CONDITION_4)))"));
philwinkle,

grazie philwinkle.base per la tua risposta, questo è un esempio di quello che ho fatto con addAttributeToFilter e AND e OR condition: pastebin.com/ZznxLAai
Andhi Irawan,

C'è un modo per determinare quale attributo ha prodotto un risultato? Sto cercando una collezione modello personalizzato in tre campi ( name, altnernate_name, description) e vorrei sapere quando il risultato è a causa del descriptionattributo.
pspahn

4

Se vuoi includere AND con la combinazione di OR allora

$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 per la tua soluzione, ma ho bisogno esattamente del contrario, ovvero WHERE (CONDITION_1 E CONDITION_2) OR (CONDITION_3 AND CONDITION_4))), puoi aiutarmi, per favore
Haris,

1

O condizione usando addFieldToFilter


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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.