如何在 Magento 的低库存集合中仅获取已启用的产品

Posted

技术标签:

【中文标题】如何在 Magento 的低库存集合中仅获取已启用的产品【英文标题】:How to get only enabled products in the low stock collection in Magento 【发布时间】:2015-12-02 16:01:38 【问题描述】:

我正在尝试仅在我的低库存系列中获取已启用的产品。

我的代码如下所示:

/** @var $collection Mage_Reports_Model_Resource_Product_Lowstock_Collection  */
        $collection = Mage::getResourceModel('reports/product_lowstock_collection')
            ->addAttributeToSelect('*')
            ->setStoreId($storeId)
            ->filterByIsQtyProductTypes()
            ->joinInventoryItem('qty')
            ->joinInventoryItem('low_stock_date')
            ->useManageStockFilter($storeId)
            ->useNotifyStockQtyFilter($storeId)
            ->setOrder('qty', Varien_Data_Collection::SORT_ORDER_ASC);

但我不能像这样向 ORM 添加过滤器:

->addAttributeToFiler('status', array('eq' => Mage_Catalog_Model_Product_Status::STATUS_ENABLED))

有人知道怎么做吗?

【问题讨论】:

你打错字了:addAttributeToFiler 而不是addAttributeToFilter 【参考方案1】:

您需要加入包含每个产品状态值的catalog_product_entity_int 表,为方便起见,请确保状态属性的attribute_id,在我的情况下是96。您可以从您的管理面板Manage Attributes 或来自eav_attribute 表。

下面是要应用的内连接:

$collection = Mage::getResourceModel('reports/product_lowstock_collection')
            ->addAttributeToSelect('*')
            ->setStoreId($storeId)
            ->filterByIsQtyProductTypes()
            ->joinInventoryItem('qty')
            ->joinInventoryItem('low_stock_date')
            ->useManageStockFilter($storeId)
            ->useNotifyStockQtyFilter($storeId)
            ->setOrder('qty', 'asc')
                 ->getSelect()
                 ->join(Mage::getConfig()->getTablePrefix().'catalog_product_entity_int', 'lowstock_inventory_item.product_id ='.Mage::getConfig()->getTablePrefix().'catalog_product_entity_int.entity_id',array('value'))
                 ->where(Mage::getConfig()->getTablePrefix().'catalog_product_entity_int.value=1 AND '.Mage::getConfig()->getTablePrefix().'catalog_product_entity_int.attribute_id=96');

这是生成的 SQL 查询:

SELECT `e`.*, `lowstock_inventory_item`.`qty`, `lowstock_inventory_item`.`low_stock_date`, `catalog_product_entity_int`.`value` FROM `catalog_product_entity` AS `e`
 INNER JOIN `cataloginventory_stock_item` AS `lowstock_inventory_item` ON e.entity_id = lowstock_inventory_item.product_id
 INNER JOIN `catalog_product_entity_int` ON lowstock_inventory_item.product_id =catalog_product_entity_int.entity_id WHERE (((`e`.`type_id` = 'simple') OR (`e`.`type_id` = 'virtual') OR (`e`.`type_id` = 'giftcard'))) AND (IF(lowstock_inventory_item.use_config_manage_stock = 1, 1, lowstock_inventory_item.manage_stock) = 1) AND (qty < IF(lowstock_inventory_item.use_config_notify_stock_qty = 1, 1, lowstock_inventory_item.notify_stock_qty)) AND (catalog_product_entity_int.value=1 AND catalog_product_entity_int.attribute_id=96)

【讨论】:

这对你有用吗?该块不呈现,但我没有收到错误消息。你为什么使用 (string) ?而且我认为 storeId 也必须有一个 where 子句。 attribute_id 对我来说是一样的。 对不起,删除了铸件,我正在调试它以检查查询。

以上是关于如何在 Magento 的低库存集合中仅获取已启用的产品的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Hibernate 解决错误“失败,因为启用了'在集合获取上的分页失败'已启用”?

在 Magento 中显示可配置产品的简单产品库存

如何从repo文件中仅提取已启用的存储库?

magento 1.9 新添加的产品没有显示在分类页面?

Magento产品因库存0而消失但库存选项不可用

Magento获取产品的库存状态