Der Grund, warum die Antwort von ColinM funktioniert, liegt in der Code-in app/code/core/Mage/Catalog/Model/Resource/Product/Collection.php- addAttributeToFilterMethode. Wenn Sie dieses Array-Format verwenden, wird es nicht aufgerufen addAttributeToSelect. Im Flat-Modus addAttributeToSelectschlägt die automatische Ausführung fehl, wenn das Attribut nicht in der Flat-Tabelle enthalten ist.
(unten ist ein erneuter Hash meiner Antwort auf /programming/6271284/can-i-add-other-attributes-to-magentos-flat-product-catalog-table/17021620 - I'm Ich bin mir nicht sicher, wie die Etikette dafür aussieht, aber ich weiß, ich hätte es hilfreich gefunden.
Ich wollte eine "saubere" Lösung für die Auswahl und Filterung von Flat-Mode-Sammlungen nach nicht-Flat-Attributen, die:
- erfordert keine spezifischen Einstellungen für das Attribut in admin (möglicherweise von einem Benutzer hinzugefügt oder im Front-End ausgeblendet)
- Funktioniert sowohl für den Flat- als auch für den Non-Flat-Modus
Ich habe die zugehörige Produktsammlung verwendet, dies gilt jedoch für alle EAV-Sammlungen.
Fehlercode:
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
->addAttributeToSelect( 'my_custom_attribute' )
->addAttributeToFilter( 'my_custom_attribute', 3 )
;
Im Flat-Modus kann der obige Code das Attribut nicht automatisch auswählen oder filtern, wenn es sich nicht in der Flat-Tabelle befindet.
Hinzufügen zur Auswahl:
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
->joinAttribute( 'my_custom_attribute', 'catalog_product/my_custom_attribute', 'entity_id', null, 'left' )
->addAttributeToSelect( 'my_custom_attribute' )
;
Die joinAttributeMethode fügt der Abfrage einen Join für das angeforderte Attribut hinzu. Es funktioniert immer noch, wenn sich das Attribut bereits in der flachen Tabelle befindet, ist jedoch etwas weniger effizient als die reine Verwendung der flachen Tabelle.
Ich habe dort einen leftJoin verwendet, um sicherzustellen, dass Produkte my_custom_attributeabgerufen werden, wenn dieser nicht für diese Produkte festgelegt ist. Ändern Sie dies, innerwenn Sie nur an Zeilen interessiert sind, in denen festgelegt my_custom_attributeist.
Hinzufügen zum Filter (gemäß obigem ColinM):
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
->addAttributeToFilter( array( array( 'attribute' => 'my_custom_attribute', 'eq' => 3 ) ) )
;
Der obige Code fügt ihn der Auswahl hinzu und folgt Ihrem Filter.
(getestet in CE 1.6.2.0)
non-flat attribute? Danke .und mach Magento nicht verwirrend. Es ist bereits verwirrend