我正在尝试构建所有可配置产品的产品系列,这些产品是“库存”或“可销售”。这些需要使用两种不同的型号。我的工作方法是:
$collectionConfigurable = Mage::getResourceModel('catalog/product_collection')->addAttributeToFilter('type_id', array('eq' => 'configurable'));
foreach ($collectionConfigurable as $_configurableproduct) {
$product = Mage::getModel('catalog/product')->load($_configurableproduct->getId());
if ($product->isSaleable()) {
// do something
}
}
然而,这个脚本真的很慢,我觉得它正在浪费资源,因为它会加载并通过每个可配置的产品。
我想要实现的是获取$ collectionConfigurable并仅使其成为库存商品。
另一种资源将此作为获取库存商品的方法。
Mage::getSingleton('cataloginventory/stock')->addInStockFilterToCollection($this->_productCollection);
但是我不确定如何将它们合并或正确使用它,我已经尝试过了:
$collectionConfigurable = Mage::getResourceModel('catalog/product_collection')->addAttributeToFilter('type_id', array('eq' => 'configurable'));
$instockConfigs = Mage::getSingleton('cataloginventory/stock')->addInStockFilterToCollection($collectionconfigurable);
返回以下错误:
Fatal error: Call to a member function joinField() on a non-object in /srv/magento/app/code/core/Mage/CatalogInventory/Model/Resource/Stock.php on line 197
答案 0 :(得分:2)
我对“库存系统更精细的细节”的方法是
创建库存项目集合,仅获取库存项目。
使用该集合创建一个instock产品ID数组
使用可配置的过滤器创建产品集合,使用收集的产品ID创建entity_id过滤器
该代码看起来像这样。
//create a stock item collection with a `is_in_stock` filter
$collection = Mage::getModel('cataloginventory/stock')
->getItemCollection()
->addFieldToFilter('is_in_stock');
//capture the product ids of the in stock stock items
$product_ids = array();
foreach($collection as $item)
{
$product_ids[] = $item->getProductId();
}
$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addFieldToFilter('entity_id',array('in'=>$product_ids))
->addFieldToFilter('type_id','configurable');
foreach($products as $product)
{
var_dump($product->getData());
}
那就是说,你的代码很慢,部分是因为你在循环中重新加载每个产品,生成一系列新的SQL语句
$product = Mage::getModel('catalog/product')->load($_configurableproduct->getId());
此外,addInStockFilterToCollection
仅适用于Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Link_Product_Collection
集合。看一下方法的doc块。
/**
* Adds filtering for collection to return only in stock products
*
* @param Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Link_Product_Collection $collection
* @return Mage_CatalogInventory_Model_Stock $this
*/
public function addInStockFilterToCollection($collection)
{
$this->getResource()->setInStockFilterToCollection($collection);
return $this;
}