Sammlungen - Filtern mehrerer Mehrfachauswahl-Attributwerte

8

Das ist kein Tippfehler.

Mir ist bewusst, dass ich 'finset' verwenden muss, um meine Mehrfachauswahlattribute zu filtern. Ich versuche jedoch, mehrere Werte gleichzeitig zu filtern und Folgendes zu erhalten:

Incorrect parameter count in the call to native function 'FIND_IN_SET.

Hier ist ein Beispielcode:

foreach ($options as $option) {
    // $option[0] contains an attribute ID as a string
    $attribute = Mage::getModel('catalog/resource_eav_attribute')->load($option[0]);

    if ($attribute->getFrontendInput() == 'multiselect') {
        $collection->addAttributeToFilter($attribute->getAttributeCode(), array('finset' => $option[1]));
    } else {
        $collection->addAttributeToFilter($attribute->getAttributeCode(), array('in' => $option[1]));
    }
}

Was ich im Frontend habe, ist eine Reihe von Feldern, jede Menge entspricht einem bestimmten Attribut und enthält Kontrollkästchen für jeden Attributwert. Basierend auf diesen Einsendungen sollte die Sammlung herausfiltern, was ausgewählt wurde.

Alles funktioniert hervorragend, bis auf den Einzelfall, in dem ich versuche, zwei der Mehrfachauswahloptionen gleichzeitig zu filtern. Wenn ich nur einen davon auswähle, funktioniert die Suche ordnungsgemäß. Wenn ich zwei oder mehr auswähle, wird der oben erwähnte MySQL-Fehler angezeigt.

Irgendwelche Ideen? Oder bin ich gezwungen, benutzerdefinierte SQL-Anweisungen zu verwenden, um diesen Filter zu erstellen?

pspahn
quelle
Wenn Sie versuchen, mehrere ausgewählte Eingabetypen zu filtern, versuchen Sie, mithilfe der catalog_product_index_eav_idxTabelle zu filtern .
Subesh Pokhrel

Antworten:

18

Soweit ich weiß, möchten Sie 2 oder mehr Werte senden und nach diesen filtern OR.
Etwas wie das:

...
WHERE
    FIND_IN_SET($v1, `some_field`) OR
    FIND_IN_SET($v2, `some_field`) OR
...

$v1 & $v2 sind die Werte Ihrer Kontrollkästchen

Dazu müssen Sie an das addAttributeToFilterArray und Array übergeben.

->addAttributeToFilter(
    array(
          array('attribute'=>'some_attribute', 'finset'=>$v1),
          array('attribute'=>'some_attribute', 'finset'=>$v2),
    )
);

Hier ist eine mögliche Implementierung.

$data = THE ARRAY OF THE CHECKBOX VALUES;

$filter = array();
foreach ($data as $value) {
    $filter[] = array(
        'attribute' => $attribute->getAttributeCode(),
        'finset'    => $value
    );
}

if (count($filter) > 0) {
    $collection->addAttributeToFilter($filter);
}
Marius
quelle
Ich erhalte meine Kategorie-ID wie folgt ($ exist_prdcat_id = 4,5, also verwende ich -> addAttributeToFilter ('category_id', Array (Array ('finset' => Array ($ exist_prdcat_id))), aber ich bekomme nicht Produkt warum?
Kannst
Ich möchte start_date und end_date filtern. Wie geht das?
MrTo-Kane
Wo soll ich diesen Code platzieren?
Zekia
@ktsixit Wo du es brauchst.
Marius
Wie kann ich 'und' ausführen? Ich meine, ich möchte die Produktsammlung basierend auf mehreren Attributwerten mit Mehrfachauswahl filtern. @Marius kannst du helfen?
Jack
-1

Dieser Code kombiniert zwei finsetBedingungen mit OR:

->addAttributeToFilter(
    array(
          array('attribute'=>'some_attribute', 'finset'=>$v1),
          array('attribute'=>'some_attribute', 'finset'=>$v2),
    )
);
Name
quelle