Multi conditions (OU et ET à l'intérieur ET) dans addAttributeToFilter

19

Comment créer une multi-condition dans addAttributeToFilter?

Je veux aboutir à une requête SQL comme celle-ci (image jointe):

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

Je vous remercieentrez la description de l'image ici

Andhi Irawan
la source
J'ai trouvé cela très utile: blog.chapagain.com.np/…
nicolallias

Réponses:

41

Vous devriez pouvoir combiner la plupart de ces techniques pour créer la requête souhaitée. Pour les tableaux de vente, vous utiliserez probablement addFieldToFilter- mais Zend_Db_Exprc'est probablement le chemin de moindre résistance pour vous:

addAttributeToFilter:

Selon le Wiki Magento : lors de la création de parenthèses qui ont des ORconditions, vous pouvez effectuer les opérations suivantes:

Si un tableau est transmis mais qu'aucun code d'attribut n'est spécifié, il sera interprété comme un groupe de conditions OR qui seront traitées de la même manière.

Donc, à partir de cela, nous pouvons construire ce qui suit:

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

Cela produira une WHEREclause du format:

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

addFieldToFilter:

Dans le cas où le modèle est directement lié à une table de base de données, les éléments suivants sont requis pour appliquer des conditions à la colonne de base de données par nom:

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

Zend_Db_Expr:

Pour des constructions beaucoup plus compliquées, vous pouvez créer votre propre clause where en utilisant Zend_Db_Expr. Par exemple :

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

La source :

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

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

philwinkle
la source
Merci pour votre réponse, mais ce que je veux, c'est faire des conditions comme: OERE (CONDITION_1 OU (CONDITION_2 ET (CONDITION_3 OU CONDITION_4)))). J'ai déjà posté la requête que je veux ci-dessus.
Andhi Irawan
1
Je pensais avoir fait valoir que vous pouvez utiliser Zend_Db_Expr:$collection->getSelect()->where(new Zend_Db_Expr("(CONDITION_1 OR (CONDITION_2 AND (CONDITION_3 OR CONDITION_4)))"));
philwinkle
merci philwinkle.base sur votre réponse, voici un exemple de ce que j'ai fait avec addAttributeToFilter et ET et OU condition: pastebin.com/ZznxLAai
Andhi Irawan
Existe-t-il un moyen de déterminer quel attribut a produit un résultat? Je recherche une collection de modèle personnalisé dans trois domaines ( name, altnernate_name, description) et je voudrais savoir quand un résultat est dû au fait de l' descriptionattribut.
pspahn
4

Si vous voulez inclure ET avec la combinaison de OU alors

$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' => ''
            )
        )
    );
Hassan Ali Shahzad
la source
2
+1 pour votre solution, mais j'ai besoin exactement de l'opposé, c'est-à-dire OERE (CONDITION_1 et CONDITION_2) OU (CONDITION_3 ET CONDITION_4))), Pouvez-vous s'il vous plaît aider
Haris
1

Ou conditionner en utilisant addFieldToFilter


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

vitts
la source