Bei Verwendung von Produktkollektionen wie folgt:
$_productCollection= Mage::getModel('catalog/product')->getCollection()
->addAttributeToSelect('*')
->addAttributeToFilter('special_price', array('neq'=>''));
Ist es möglich, addAttributeToFilter für ein Attribut relativ zu einem anderen Attribut zu verwenden? zB Kann ich special_price größer als price mit so etwas filtern
$_productCollection= Mage::getModel('catalog/product')->getCollection()
->addAttributeToSelect('*')
->addAttributeToFilter('special_price', array('gt'=>'price'));
HAVING
Sie können
Zend_Db_Expr
Raw-SQL anstelle von Werten verwenden. Bei Produktsammlungen müssen Sie jedoch vorsichtig sein, da die Abfrage anders ist, wenn der flache Produktindex aktiviert istEAV (Flat Index deaktiviert oder Admin-Bereich)
Hier brauchen wir auch einen Filter für das zweite Attribut hinzufügen , weil die Attribute werden ausgewählt wird in einer zweiten Abfrage geladen werden und Sie haben keinen Zugriff auf sie aus anderen Gründen . Wählen Sie etwas, das immer wahr ist. Ich habe mich für 'notnull' entschieden. Auf die verknüpfte Attributtabelle kann mit "at_" + Attributcode verwiesen werden:
Verwenden des flachen Index
Mit dem Flat-Index können Sie direkt auf jedes Attribut zugreifen, das im Flat-Index enthalten ist (dh "In der Produktliste verwendet"):
Universelle Lösung
Mit
addExpressionAttributeToSelect()
@Marius können wir sicherstellen, dass alle im Ausdruck verwendeten Attribute verfügbar sind, ohne dass ein Dummy-Filter hinzugefügt werden muss (beide sind nur Problemumgehungen, funktionieren aber gleich gut). Dann müssen wir nur einen anderen Ausdruck verwenden, abhängig vonisEnabledFlat()
:Beachten Sie, dass wir
difference
den Filter nicht verwenden , da erWHERE
ausgeführt wird, bevor der Wert berechnet wird. Dies bedeutet aber auch, dass MySQL die Abfrage besser optimieren kann als mitHAVING
, das zuletzt ausgeführt wird.quelle