Filterabfrage für Produktlistenattribute

12

Ich habe einen Filter in Methode _getProductCollection() der Klasse Mage_Catalog_Block_Product_List wie folgt hinzugefügt .

protected function _getProductCollection()
{
     ...
    $this->_productCollection = $layer->getProductCollection();
    $this->_productCollection->getSelect()->joinInner(
        array('cpe' => 'catalog_product_entity'),
        'e.entity_id = cpe.entity_id'
    ) 
    ->where("cpe.type_id = 'simple'"); 
    ...
}

Der obige Code funktioniert ab Magento Version 1.7 einwandfrei. Aber wann immer ich den folgenden Code schreibe, gibt es

Spalte nicht gefunden: 1054 Unbekannte Spalte 'e.type_id' in 'where-Klausel'

Error.

Der Code (der nicht funktioniert).

protected function _getProductCollection()
{
     ...
    $this->_productCollection = $layer->getProductCollection();
    $this->_productCollection
        ->addAttributeToSelect('type_id')
        ->addAttributeToFilter('type_id','simple');
    ...
}

Nun die Fragen .

  1. Wird es Leistungseinbußen geben, wenn ich den ersten Arbeitscode verwende?
  2. Gibt es eine andere Möglichkeit, um einen geeigneten Produktfilter zu erhalten?

AKTUALISIEREN:

Immer wenn ich den folgenden Code anwende und das rwdThema verwende, wird keine Fehlermeldung angezeigt. Aber wenn ich ein defaultTheme benutze, erhalte ich den folgenden Fehler:

Code

protected function _getProductCollection()
{
     ...
    $this->_productCollection = $layer->getProductCollection();
    $this->_productCollection
         ->addAttributeToSelect('type_id')
         ->addAttributeToFilter('type_id','simple');
    ...
}

Error

SQLSTATE [42S22]: Spalte nicht gefunden: 1054 Unbekannte Spalte 'e.type_id' in 'where-Klausel', Abfrage war: SELECT FLOOR ((ROUND ((e.min_price) * 1, 2)) / 10) + 1 AS range, COUNT (*) AS countVON catalog_product_index_priceAS e INNER JOIN catalog_category_product_indexAS cat_indexON cat_index.product_id = e.entity_id UND cat_index.store_id = 1 und cat_index.visibility IN (2, 4) und cat_index.category_id = '3' , wobei ( e. type_idIN ( 'einfachen' )) AND (e.website_id = '1') AND (e.customer_group_id = 0) AND (e.min_price IST NICHT NULL) GROUP BY FLOOR ((RUND ((e.min_price) * 1, 2)) / 10) + 1 ORDER BY FLOOR ((RUND ((e.min_price) * 1, 2)) / 10) + 1 ASC

Magento-Lernender
quelle
Welche Magento-Version hast du? * & haben Magento Patches angewendet
Amit Bera
1
wtf? Jetzt hat es Sinn ... Ich habe versucht, eine EE 1.14 auf RWD zu testen, das ist einfach inakzeptabel. Wie kann ein Ansichtsthema eine gesamte Abfrage ändern, noch schlimmer, wie kann die Haupttabelle geändert werden? Dies konnte nichts anderes als ein Fehler sein . Gut gemacht @Magento Learner!
MauroNigrele
Genau das Ansichtsthema schafft Probleme. Vielen Dank. Der Code sollte unabhängig von einem Thema sein
Magento Learner

Antworten:

0

Ich denke, dass:

$collection->addAttributeToFilter('type_id', array('eq' => 'simple');

Sollte dies funktionieren, müssen Sie nichts hinzufügen type_id, selectda es sich um eine catalog_product_entitySpalte handelt, die standardmäßig abgerufen wird. Ich empfehle immer, die endgültige Abfrage zu protokollieren, um eine optimale Vorstellung davon zu erhalten, was passiert:

Mage.:log($collection->getSelectSql(true));

Übrigens: Der erste Codeblock hat überhaupt keinen Sinn, da Sie die Haupttabelle ( catalog_product_entity) mit sich selbst verbinden.

MauroNigrele
quelle
"In Magento 1.7 haben sie eine Optimierung für das ausgewählte SQL durchgeführt, das für die Preisfilteroptionen verwendet wird. Sie entfernen den FROM-SQL-Teil (der eine Produktentität ist - die das Attribut type_id enthält) und machen die preis_index-bezogene Tabelle zur Haupttabelle Dies wird im FROM-Teil der Abfrage verwendet. Im Grunde genommen ist die Tabelle, aus der die Daten ausgewählt werden, nicht mehr die Produktentitätstabelle (Sie verlieren alle Produktbasisattribute). Die Haupttabelle wird zum Produktindex. Dies ist ein Kernupdate, das Das Magento-Team hat ab Version 1.7 hinzugefügt. " Siehe die folgenden
Magento Learner
1
Werben Sie aus irgendeinem Grund, ich habe in der getCollection-Methode des Backend-Blocks nachgedacht. In diesem Szenario ist Ihr erster Code in Ordnung. Ich bin mir nicht sicher, ob es die beste Lösung ist, aber es scheint in Ordnung zu sein. Entschuldigung
MauroNigrele
@MagentoLearner Bist du dir bei diesem Beitrag sicher? Ich habe gerade einen EE1.14 erneut überprüft, den ich installiert habe und der immer noch catalog_product_entity als Haupttabelle verwendet, außer wenn Sie die Verwendung eines flachen Katalogs festlegen (absolut empfohlen), aber in beiden Fällen ist type_id in der Auswahl vorhanden. Können Sie die Abfrage so protokollieren, wie ich sie in der ursprünglichen Antwort geschrieben habe?
MauroNigrele
1
mmmm interessant ... i Überprüfen Sie auch die Abfrage in einem Suchfall und verwenden Sie catalog_product_entity als Haupttabelle. Vielleicht hat das "Magento-Team" beschlossen, diese Änderungen rückgängig zu machen. Ich kann keine installierte Version 1.7 finden, um sie zu überprüfen, aber die Idee, die Haupttabelle einer Entität zu ändern, klingt nach einer sehr schlechten architektonischen Entscheidung ... Beachten Sie, dass Sie gerade mein Wochenende ruiniert haben. Jetzt muss ich eine CE1 finden und installieren .7 und schau diesen Mist mit meinen eigenen Augen ... meine Frau wird damit nicht glücklich sein :)
MauroNigrele