Php Magento:构建库存中所有可配置产品的自定义产品集合
我正试图建立一个所有可配置产品的产品集合,这些产品是“库存”或“可销售的”。这需要使用两种不同的模型。我的工作方法是:Php Magento:构建库存中所有可配置产品的自定义产品集合,php,magento,magento-1.7,Php,Magento,Magento 1.7,我正试图建立一个所有可配置产品的产品集合,这些产品是“库存”或“可销售的”。这需要使用两种不同的模型。我的工作方法是: $collectionConfigurable = Mage::getResourceModel('catalog/product_collection')->addAttributeToFilter('type_id', array('eq' => 'configurable')); foreach ($collectionConfigurable as $_c
$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
我的“对股票系统更精细细节的天真”方法是
//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\u Catalog\u Model\u Resource\u Eav\u Mysql4\u Product\u Link\u Product\u 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;
}
遗憾的是,他们没有键入hint()@SteveRobbins传统观点认为,键入提示会带来性能开销,特别是在Magento的PHP(5.2)target的旧版本中。很容易理解为什么一个团队交付了一个广泛部署的应用程序,却放弃了类型提示而支持docblock提示。