Multi Conditionals (OR und AND innerhalb von AND) in addAttributeToFilter

19

Wie erstelle ich eine Multi-Bedingung in addAttributeToFilter?

Ich möchte folgende SQL-Abfrage erhalten (Bild angehängt):

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

Vielen DankBildbeschreibung hier eingeben

Andhi Irawan
quelle
Ich fand das sehr nützlich: blog.chapagain.com.np/…
nicolallias

Antworten:

41

Sie sollten in der Lage sein, die meisten dieser Techniken zu kombinieren, um die gewünschte Abfrage zu erstellen. Für Verkaufstische werden Sie wahrscheinlich verwenden addFieldToFilter- aber dies Zend_Db_Exprist wahrscheinlich der Weg des geringsten Widerstands für Sie:

addAttributeToFilter:

Laut Magento Wiki : Wenn Sie Klammern mit ORBedingungen erstellen, können Sie Folgendes tun:

Wird ein Array übergeben, aber kein Attributcode angegeben, wird es als Gruppe von OR-Bedingungen interpretiert, die auf die gleiche Weise verarbeitet werden.

Daraus können wir also folgendes konstruieren:

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

Dies gibt eine WHEREKlausel des Formats aus:

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

addFieldToFilter:

In dem Fall, in dem das Modell direkt mit einer DB-Tabelle verknüpft ist, ist Folgendes erforderlich, um Bedingungen namentlich auf die Datenbankspalte anzuwenden:

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

Zend_Db_Expr:

Für viel kompliziertere Konstrukte können Sie Ihre eigene where-Klausel mit erstellen Zend_Db_Expr. Zum Beispiel :

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

Quelle :

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

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

Philwinkle
quelle
Vielen Dank für Ihre Antwort. Ich möchte jedoch folgende Bedingung erstellen: WHERE (CONDITION_1 OR (CONDITION_2 AND (CONDITION_3 OR CONDITION_4))). Ich poste bereits die Anfrage, die ich oben möchte.
Andhi Irawan
1
Ich dachte, ich habe den Punkt gemacht, den Sie verwenden können Zend_Db_Expr:$collection->getSelect()->where(new Zend_Db_Expr("(CONDITION_1 OR (CONDITION_2 AND (CONDITION_3 OR CONDITION_4)))"));
Philwinkle
Dank philwinkle.base auf Ihre Antwort, ist diese Probe , was ich mit addAttributeToFilter tat und AND und OR - Bedingung: pastebin.com/ZznxLAai
Andhi Irawan
Gibt es eine Möglichkeit zu bestimmen, welches Attribut zu einem Ergebnis geführt hat? Ich suche eine benutzerdefinierte Modellsammlung über drei Felder ( name, altnernate_name, description) und würde gerne wissen , wenn ein Ergebnis aufgrund der ist descriptionAttribut.
pspahn
4

Wenn Sie UND mit der Kombination von ODER einschließen möchten, dann

$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
quelle
2
+1 für Ihre Lösung, aber ich brauche genau das Gegenteil, dh WO (CONDITION_1 und CONDITION_2) oder (CONDITION_3 und CONDITION_4)), können Sie bitte helfen
Haris
1

Oder bedingen Sie mit addFieldToFilter


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

vitts
quelle