Filtern der Kategoriesammlung führt zu falschem Verhalten bei aktiviertem Flat-Katalog


7

Ich habe Code, um eine grundlegende Suche nach Kategorien durchzuführen. Es funktioniert durch Suchen des Kategorienamens und der Beschreibung - Attribute, die beide Kern sind.

Der Code, den ich habe, lautet wie folgt:

$_categories = Mage::getModel('catalog/category')->getCollection()  
    ->addAttributeToSelect('name')
    ->addAttributeToSelect('description')
    ->addAttributeToSelect('associated_brand')
    ->addAttributeToSelect('image')
    ->setPageSize(12)
    ->setCurPage(1)
    ->addAttributeToFilter('level',['gt' => 2])
    ->addAttributeToFilter('is_active',['eq'=>true])
    ->addAttributeToFilter(
        [
            ['attribute' => 'name', 'like' => '%'.$searchterm.'%'],
            ['attribute' => 'description', 'like' => '%'.$searchterm.'%']
        ]
    )->load();

Vor dem Aktivieren des flachen Katalogs für Kategorien wurden die erwarteten Ergebnisse zurückgegeben - alle Kategorien, deren Name oder Beschreibung mit dem Suchbegriff übereinstimmt.

Wenn der flache Katalog aktiviert ist, funktioniert die Namens- oder Beschreibungssuche nicht. Wenn ich die zugrunde liegende Sammlungsabfrage ausgeben möchte, ist dies wie folgt:

SELECT `main_table`.`entity_id`, `main_table`.`level`, `main_table`.`path`, `main_table`.`position`, `main_table`.`is_active`, `main_table`.`is_anchor`, `main_table`.`name`, `main_table`.`description`, `main_table`.`associated_brand`, `main_table`.`image` 
FROM `catalog_category_flat_store_1` AS `main_table` 
WHERE (level > 2) AND (is_active = '1')

Wie aus dem Obigen ersichtlich ist, fehlen der Name und die Beschreibungsklausel vollständig.

Ich habe die generierte catalog_category_flat_store_1Tabelle überprüft und die Felder sind dort vorhanden.

Irgendwelche Ideen, warum Magento diese Filter nur bei Verwendung des flachen Katalogs aus der Abfrage entfernt?

Antworten:


2

Im \Mage_Catalog_Model_Resource_Category_Flat_Collection::addAttributeToFilter

public function addAttributeToFilter($attribute, $condition = null)
{
    if (!is_string($attribute) || $condition === null) {
        return $this;
    }

    return $this->addFieldToFilter($attribute, $condition);
}

Es scheint nicht möglich zu sein, ein Array im ersten Parameter zu haben. Sie müssen das Select-Objekt abrufen und Ihre Abfrage manuell ausführen, wenn flat aktiviert ist.

Ich hoffe das hilft,


Dies ist also nur ein weiteres Beispiel, bei dem die Implementierung eines flachen Katalogs nicht mit der Standard-EAV-Implementierung kompatibel ist.
BrynJ

leider ja. Dies ist ein großes Problem in der Kategorie. Wenn ich ein Projekt starte, verwende ich normalerweise Flat oder EAV, ändere mich jedoch nie im Projektlebenszyklus.
Chatard

Was ist, wenn Sie addFieldToFilter()stattdessen direkt verwenden? Ich sehe keinen Grund, warum es nicht funktionieren sollte
Fabian Schmengler

Ja, es wird nur funktionieren, wenn Sie immer flat verwenden (funktioniert nicht auf EAV)
bchatard
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.