Zend_Db_Expr
値の代わりに生のSQLを使用できます。ただし、商品コレクションでは、フラット商品インデックスが有効になっているとクエリが異なるため、注意が必要です。
EAV(フラットインデックスがオフまたは管理領域)
ここで、2番目の属性のフィルターも追加する必要があります。選択する属性は2番目のクエリで読み込まれ、それ以外の場合はアクセスできないためです。常に真実であるものを選択し、私は「notnull」を選びました。結合された属性テーブルは、 "at_" +属性コードで参照できます。
$_productCollection
->addAttributeToFilter('price', ['notnull' => true])
->addAttributeToFilter(
'special_price',
['lt' => new Zend_Db_Expr('at_price.value')]
);
フラットインデックスの使用
フラットインデックスを使用すると、フラットインデックスに含まれている任意の属性に直接アクセスできます(「製品リストで使用」など)。
$_productCollection->addAttributeToFilter(
'special_price',
['lt' => new Zend_Db_Expr('price')]
);
ユニバーサルソリューション
使用addExpressionAttributeToSelect()
@Mariusにより示唆されるように、私たちは式の中で使用されるすべての属性がダミーフィルタ(両方とも同じようにうまく単に回避策が、作業している)を追加することなく、利用できることを確認することができます。次に、以下に応じて、異なる式を使用するだけです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]
);
値が計算される前に実行されるdifference
ため、実際にはフィルターで使用しないことに注意してくださいWHERE
。しかしこれは、MySQLがHAVING
最後に実行されるを使用するよりもクエリを最適化できることも意味します。
HAVING