【问题标题】:How to load products from a specific category based on special price availability?如何根据特价可用性加载特定类别的产品?
【发布时间】:2016-01-08 16:21:40
【问题描述】:

我有以下代码

$promoCatId = (int)Mage::getStoreConfig('promoprodsec/promoprodgroup/promocategoryid');

$products = Mage::getModel('catalog/category')->setStoreId($store)->load($promoCatId)
    ->getProductCollection();

$allProductsInPromoCategory = $products->getAllIds();

它为我提供了 $promoCatId 类别的所有产品。

现在我想从$allProductsInPromoCategory的所有产品中获取所有没有特价或特价日期范围已过期的产品

如何在不使用 foreach 循环并再次加载每个产品集合的情况下完成此操作?

foreach ($allProductsInPromoCategory as $promoprod) {
    Mage:getModel('catalog/product')->load( $promoprod);

    //do validation for the special price criteria
}

【问题讨论】:

    标签: magento magento-1.7 magento-1.8 magento-1.4


    【解决方案1】:

    在您的类别中声明->getProductCollection() 后,您最终会得到一个Mage_Catalog_Model_Resource_Product_Collection 类型的对象,它基本上是一个与其他所有产品一样的产品集合。

    由于这个集合是一个EAV集合,你可以借助addAttributeToFilter函数过滤它

    由于您实际上想要一个 OR (where special price is null or special to date <= now()),因此您希望您的两个条件在同一个 addAttributeToFilter

    所以我想说你可以通过这样做来实现:

    $promoCatId  = (int)Mage::getStoreConfig('promoprodsec/promoprodgroup/promocategoryid');
    
    $products = Mage::getModel('catalog/category')
                    ->setStoreId($store)
                    ->load(promoCatId)
                    ->getProductCollection()
                    ->addAttributeToFilter(
                        array(
                            array('attribute' => 'special_price', 'null' => true),
                            array('attribute' => 'special_from_date', 'lt' => Mage::getModel('core/date')->date(Varien_Date::DATETIME_PHP_FORMAT))
                        )
                    );
    
    $allProductsInPromoCategory = $products->getAllIds();
    
    echo $products->getSelect();
    

    了解有用:

    • 我实际上是使用Mage::getModel('core/date')->date(Varien_Date::DATETIME_PHP_FORMAT) 来获取相对于商店配置的区域设置时区的当前日期
    • 集合上的echo $products->getSelect(); 将向您显示 Magento 完成的查询,这对于实际查看您真正想要的位置是否非常有用。就我而言,它显示:

    SELECT `e`.*, `cat_index`.`position` AS `cat_index_position`, `at_special_price`.`value` AS `special_price`, IF(at_special_from_date.value_id > 0, at_special_from_date.value, at_special_from_date_default.value) 作为`special_from_date` FROM `catalog_product_entity` AS `e` INNER JOIN `catalog_category_product_index` AS `cat_index` ON cat_index.product_id=e.entity_id AND cat_index.store_id=1 AND cat_index.category_id = '15' 内连接 `catalog_product_entity_decimal` AS `at_special_price` ON (`at_special_price`.`entity_id` = `e`.`entity_id`) AND (`at_special_price`.`attribute_id` = '76') AND (`at_special_price`.`store_id` = 0) 内部联接 `catalog_product_entity_datetime` AS `at_special_from_date_default` 开启 (`at_special_from_date_default`.`entity_id` = `e`.`entity_id`) AND (`at_special_from_date_default`.`attribute_id` = '77') AND `at_special_from_date_default`.`store_id` = 0 左连接 `catalog_product_entity_datetime` AS `at_special_from_date` ON (`at_special_from_date`.`entity_id` = `e`.`entity_id`) AND (`at_special_from_date`.`attribute_id` = '77') AND (`at_special_from_date`.`store_id` = 1) 哪里 ((at_special_price.value 为 NULL) 或 (IF(at_special_from_date.value_id > 0, at_special_from_date.value, at_special_from_date_default.value)

    【讨论】:

    • 感谢您的回复,虽然我使用了不同的方法,但它给了我纠正方法的想法。
    猜你喜欢
    • 2018-03-10
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 2021-07-22
    相关资源
    最近更新 更多