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
我的“对股票系统更精细细节的天真”方法是

  • 创建库存项目集合,仅获取库存项目

  • 使用该集合创建instock产品ID数组

  • 使用可配置过滤器创建产品集合,以及使用收集的产品id创建实体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\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提示。