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 ist
EAV (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:
$_productCollection
->addAttributeToFilter('price', ['notnull' => true])
->addAttributeToFilter(
'special_price',
['lt' => new Zend_Db_Expr('at_price.value')]
);
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"):
$_productCollection->addAttributeToFilter(
'special_price',
['lt' => new Zend_Db_Expr('price')]
);
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 von isEnabledFlat()
:
$priceExpression = $_productCollection()->isEnabledFlat()
? new Zend_Db_Expr('price')
: new Zend_Db_Expr('at_price.value');
$_productCollection
->addExpressionAttributeToSelect('difference', '(IF ({{special_price}} > {{price}} , 1, 0))', array('special_price', 'price'));
->addAttributeToFilter(
'special_price',
['lt' => $priceExpression]
);
Beachten Sie, dass wir difference
den Filter nicht verwenden , da er WHERE
ausgeführt wird, bevor der Wert berechnet wird. Dies bedeutet aber auch, dass MySQL die Abfrage besser optimieren kann als mit HAVING
, das zuletzt ausgeführt wird.
HAVING