Der Grund, warum die Antwort von ColinM funktioniert, liegt in der Code-in app/code/core/Mage/Catalog/Model/Resource/Product/Collection.php
- addAttributeToFilter
Methode. Wenn Sie dieses Array-Format verwenden, wird es nicht aufgerufen addAttributeToSelect
. Im Flat-Modus addAttributeToSelect
schlä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 joinAttribute
Methode 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 left
Join verwendet, um sicherzustellen, dass Produkte my_custom_attribute
abgerufen werden, wenn dieser nicht für diese Produkte festgelegt ist. Ändern Sie dies, inner
wenn Sie nur an Zeilen interessiert sind, in denen festgelegt my_custom_attribute
ist.
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