如何比较集合中Magento中的2个不同字段

时间:2012-08-27 19:17:20

标签: php magento

我试图将产品价格与Magento系列中的销售价格进行比较。具体而言,尝试查找销售价格大于或等于其基本价格的所有产品。

逻辑上,我试图将字段名称放入addAttributeToFilter调用:

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

但那没用。是否有一个很好的方法来做到这一点,不需要我以每个销售价格的产品来手动检查销售价格是否大于或等于其基本价格?

这很奇怪,有时显示Magento系列有多奇怪。事实证明,仅仅因为你将->addAttributeToSelect('price')放入你的调用链中,并不意味着你能以一种漂亮的方式获得价格。所以我必须做的是放入条件,以便我可以在查询的其他部分访问它。我选择->addAttributeToFilter('price', array('gteq' => 0))。我必须以特价来做同样的事情。

然后,当涉及到where条件时,我仍然无法使用简单的名称访问价格和特殊价格,所以我不得不使用他们的表值,所以我的where语句最终为$products->getSelect()->where('_table_special_price.value >= _table_price.value'); < / p>

最后这是我整个链的样子(那里有一些自定义属性):

$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)
;

$ products-&gt; getSelect() - &gt;其中('_table_special_pricevalue&gt; = _table_pricevalue');

2 个答案:

答案 0 :(得分:5)

试试这个:

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

如果它不起作用,你可以这样做:

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

答案 1 :(得分:0)

不得不做类似的事情。

除了使用special_price&gt; = 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);