2012-08-27 61 views
2

我試圖將產品價格與其在Magento集合中的銷售價格進行比較。具體而言,試圖找到所有銷售價格大於或等於其基本價格的產品。如何在集合中比較Magento中的2個不同字段

從邏輯上講,我想只是把字段名到addAttributeToFilter電話:

->addAttributeToFilter('special_price', array('gteq' => 'special_price')); 

但沒有奏效。有沒有一種很好的方法可以做到這一點,不需要我讓每一件銷售價格的產品手動檢查銷售價格是否大於或等於其基準價格?

SOLUTION

這是很奇怪的並顯示奇Magento的收藏怎麼能有時。事實證明,僅僅因爲你把->addAttributeToSelect('price')放到了你的通話鏈中,並不意味着你以一個很好的方式獲得價格。所以我所要做的就是放入一個條件語句,以便我可以在查詢的其他部分訪問它。我選擇了->addAttributeToFilter('price', array('gteq' => 0))。我必須以特殊價格做同樣的事情。

然後當它來到放置到WHERE條件,我仍然沒有方便的名字獲得的價格和優惠的價格,所以我不得不where語句結束了$products->getSelect()->where('_table_special_price.value >= _table_price.value');

使用他們的表值,所以我的這到底是我的整個鏈條看上去像(裏面還有幾個自定義屬性):

$products = Mage::getModel('catalog/product') 
->getCollection() 
->addAttributeToSelect('id') 
->addAttributeToSelect('name') 
->addAttributeToSelect('price') 
->addAttributeToSelect('special_price') 
->addAttributeToFilter('price', array('gteq' => 0)) 
->addAttributeToFilter('special_price', array('gteq' => 0)) 
->addAttributeToFilter('visibility', 4) 
->addAttributeToFilter('discontinued', array('neq' => 1)) 
->addAttributeToFilter('status', 1) 
; 

$產品 - > getSelect() - >在哪裏( '_table_special_pricevalue> = _table_pricevalue' );

回答

4

試試這個:

->addAttributeToFilter('special_price', array ('gteq' => new Zend_Db_Expr('price'))); 

如果它不工作,你可以去這樣的:

->getSelect()->where("special_price >= price"); 
+0

你幾乎讓我在那裏。爲了完成這項工作,請參閱編輯我的問題,瞭解我必須做的所有事情。 –

0

不得不做一些類似的。

除了使用special_price> = price獲取產品外,它還演示了查詢計算字段的策略(排除價格以.09或.05結尾的產品)。

此外,它還演示瞭如何通過一個最大限度減少內存使用量的(大型)收集頁面等。可能對您有用。

$products = Mage::getModel('catalog/product') 
     ->getCollection() 
     ->addAttributeToSelect('*') 
     ->addAttributeToFilter('status', 1) 
     ->addAttributeToFilter('price', array('neq' => '-1')) // Easy way to join price EAV tables to select 
     ->addAttributeToFilter('special_price', array('neq' => '-1')); 

$price = 'at_price.value'; 
$special_price = 'at_special_price.value'; 

$price_cents = new Zend_Db_Expr("({$price} - FLOOR({$price})) * 100"); 
$special_price_cents = new Zend_Db_Expr("({$special_price} - FLOOR({$special_price})) * 100"); 

$allProducts->getSelect() 
    ->where("(
     {$price_cents} != 9 OR 
     {$special_price_cents} != 5 
    ) AND 
    {$special_price_cents} >= {$price_cents}"); 

// You can see the query by uncommenting this part  
//echo "\r\n\r\n"; 
//echo $allProducts->getSelect(); 
//echo "\r\n\r\n"; 

$products->setPageSize(100); 

$pages = $products->getLastPageNumber(); 
$currentPage = 1; 
do {  
    $products->setCurPage($currentPage); 
    $products->load(); 

    foreach ($products as $_product) { 
     echo "Product: ID-" . $_product->getId() . ", price-" . $_product->getPrice() . ", special price-" . $_product->getSpecialPrice() . "\r\n"; 
     echo "Memory used: " . memory_get_usage() . "/" . memory_get_peak_usage() . "\r\n"; 

    } 

    $currentPage++; 
    //make the collection unload the data in memory so it will pick up the next page when load() is called. 
    $allProducts->clear(); 
} while ($currentPage <= $pages); 
相關問題