Ich mache folgendes:
$productCollection = Mage::getModel('catalog/product')
->getCollection();
$productCollection
->addAttributeToFilter('my_attribute', 1);
my_attribute
ist nicht in den flachen Tabellen, aber flache Tabellen sind aktiviert.
Ich bekomme immer die volle Sammlung.
Der Grund scheint zu sein in \Mage_Catalog_Model_Resource_Product_Collection::addAttributeToSelect
:
$columns = $this->getEntity()->getAttributeForSelect($attributeCode);
No $this->getEntity()
ist eine Instanz, Mage_Catalog_Model_Resource_Product_Flat
die die flachen Felder abruft. Wenn keine gefunden wird, wird nur null zurückgegeben.
Was ist eine saubere Methode, um dem Sammlungsfilter ein nicht flaches Attribut hinzuzufügen?
In meinem Fall macht es keinen Sinn, das Attribut der flachen Tabelle hinzuzufügen.
ce-1.7.0.2
collection
Alex
quelle
quelle
non-flat attribute
? Danke .und mach Magento nicht verwirrend. Es ist bereits verwirrendAntworten:
Sie könnten sich selbst an den nötigen Tisch setzen.
Vielleicht möchten Sie auch store_id beitreten.
quelle
Ein Hack (CE 1.6.2.0+) besteht darin, die Bedingung als Array zu übergeben und zu glauben, dass dies wie beabsichtigt funktioniert oder nicht:
quelle
addFieldToFiler
ein Wrapper für istaddAttributeToFilter
und dieses Attribut optional als Array übergeben werden kann:if (is_array($attribute)) { $sqlArr = array(); foreach ($attribute as $condition) { $sqlArr[] = $this->_getAttributeConditionSql($condition['attribute'], $condition, $joinType); } $conditionSql = '('.implode(') OR (', $sqlArr).')'; }
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 aufgerufenaddAttributeToSelect
. Im Flat-ModusaddAttributeToSelect
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:
Ich habe die zugehörige Produktsammlung verwendet, dies gilt jedoch für alle EAV-Sammlungen.
Fehlercode:
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:
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 Produktemy_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 festgelegtmy_custom_attribute
ist.Hinzufügen zum Filter (gemäß obigem ColinM):
Der obige Code fügt ihn der Auswahl hinzu und folgt Ihrem Filter.
(getestet in CE 1.6.2.0)
quelle
In dem
Mage_Rss
Modul verwendete sie das ein hacky-Verfahren der flachen Tabellen zu deaktivieren. Sie nutzen die Tatsache, dass flache Tabellen im Admin-Store immer deaktiviert sind und emulieren daher einfach den Admin-Store.Nach dem Start der Emulation sollten Sie diese mit zurücksetzen
emulationModel->stopEnvironmentEmulation()
quelle
Wenn Sie das Attribut erstellen, sollte es auf globaler Ebene und filterbar sein. Auf diese Weise kann es in der Layared Navigation verwendet werden. Außerdem muss das Attribut Dropdown oder Mehrfachauswahl sein. Ich würde persönlich davon abraten, die Kerndateien in diesem Fall an Ihre Bedürfnisse anzupassen
quelle