如何在 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 的低库存集合中仅获取已启用的产品的主要内容,如果未能解决你的问题,请参考以下文章