如何获取缺货的产品集合-与addInStockFilterToCollection()相反?


9

我需要在两个列表中显示类别的产品-一个用于库存商品,另一个用于缺货商品。

我在用着

Mage::getSingleton('cataloginventory/stock')->addInStockFilterToCollection()

过滤我的库存商品的产品集合,但是似乎没有等效的方法来过滤缺货的商品-我研究了Mage_CatalogInventory_Model_Stock模型,定义了上述方法。

我已经看到了以下示例,该示例用于检索缺货的产品:

$collection->joinField(
                    'is_in_stock',
                    'cataloginventory/stock_item',
                    'is_in_stock',
                    'product_id=entity_id',
                    '{{table}}.stock_id=1',
                    'left'
            )
            ->addAttributeToFilter('is_in_stock', array('eq' => 0));

...但是可以肯定的是,这不仅是实现这一目标的最佳方法,还是最佳方法?

Answers:


3

假设这$collection是您构建的产品集合,如下所示:

$collection = Mage::getModel('catalog/product')->getCollection()
    ->...additional filters here...;

现在对您的收藏集执行此操作。这将集合与库存状态表结合在一起。

$website = Mage::app()->getWebsite();
Mage::getModel('cataloginventory/stock_status')->addStockStatusToSelect($collection, $website);

现在,您可以过滤出缺货的产品:

$collection->getSelect()->where('stock_status.stock_status = ?', 0);

不管为每个产品的库存设置了什么配置选项,这项工作都可行吗?(例如,一种产品没有进行库存管理还是没有库存管理?)
BrynJ 2015年

它应该工作,因为库存表已建立索引并且考虑了所有可能的设置。您只需要确保自己的股票指数是最新
马吕斯

感谢您的确认。这似乎是获取此数据的一种不错的“轻量级”方法。
BrynJ 2015年

使用库存状态索引表代替库存项目表确实是最好的解决方案。
Fabian Schmengler,2015年

我必须将产品选择作为函数Mage :: getModel('cataloginventory / stock_status')-> addStockStatusToSelect($ collection-> getSelect(),$ website)的第一个参数发送;
minlare

2

您的示例未考虑“ use config”的值。

让我们看一下如何addInStockFilterToCollection工作:

public function addInStockFilterToCollection($collection)
{
    $this->getResource()->setInStockFilterToCollection($collection);
    return $this;
}

好的,它委托给另一种方法:

public function setInStockFilterToCollection($collection)
{
    $manageStock = Mage::getStoreConfig(Mage_CatalogInventory_Model_Stock_Item::XML_PATH_MANAGE_STOCK);
    $cond = array(
        '{{table}}.use_config_manage_stock = 0 AND {{table}}.manage_stock=1 AND {{table}}.is_in_stock=1',
        '{{table}}.use_config_manage_stock = 0 AND {{table}}.manage_stock=0',
    );

    if ($manageStock) {
        $cond[] = '{{table}}.use_config_manage_stock = 1 AND {{table}}.is_in_stock=1';
    } else {
        $cond[] = '{{table}}.use_config_manage_stock = 1';
    }

    $collection->joinField(
        'inventory_in_stock',
        'cataloginventory/stock_item',
        'is_in_stock',
        'product_id=entity_id',
        '(' . join(') OR (', $cond) . ')'
    );
    return $this;
}

这将使库存表符合以下条件:

  1. 产品不使用全局配置并且“管理库存”设置为“是” 并且有库存

    要么

  2. 产品不使用全局配置并且“管理库存”设置为“否”

    要么

  3. 产品使用全局配置并且如果全局配置为“管理库存=是”,则表示有库存

您需要反转条件,如下所示:

  1. 产品不使用全局配置并且“管理库存”设置为“是” 并且没有库存

    要么

  2. 产品采用全球配置全球配置是“管理股票= YES” 无货

说明:您仅采用实际检查了in_stock的条件,并将比较值更改为0。未检查in_stock的条件(“ manage stock” =“ no”)意味着该产品始终处于库存状态,而与库存状态无关,因此我们不会将它们包括在“缺货”查询中。

然后这是您的代码:

public function setOutOfStockFilterToCollection($collection)
{
    $manageStock = Mage::getStoreConfig(Mage_CatalogInventory_Model_Stock_Item::XML_PATH_MANAGE_STOCK);
    $cond = array(
        '{{table}}.use_config_manage_stock = 0 AND {{table}}.manage_stock=1 AND {{table}}.is_in_stock=0'
    );

    if ($manageStock) {
        $cond[] = '{{table}}.use_config_manage_stock = 1 AND {{table}}.is_in_stock=0';
    }

    $collection->joinField(
        'inventory_in_stock',
        'cataloginventory/stock_item',
        'is_in_stock',
        'product_id=entity_id',
        '(' . join(') OR (', $cond) . ')'
    );
    return $this;
}

很棒的详细答案。因此,您建议为此创建一个模块以扩展Mage_CatalogInventory_Model_Stock模型?
BrynJ 2015年

1
没有重写或扩展。您可以将这种方法放在不使用的任何地方$this。它也可以是简单的功能。我将创建一个单独的模块并将其用作帮助程序方法(或者,如果您需要其他模块使用此方法,请将其添加到该模块的帮助程序中)
Fabian Schmengler 2015年

1

以下代码段将为您返回状态为“启用”,可见性为“目录,搜索”和库存状态为“缺货”的产品。

$productDetails = Mage::getModel('catalog/category')->load($cat_id)
                  ->getProductCollection()
                  ->addAttributeToSelect('*');

$productDetails->addAttributeToFilter('visibility', 4); 
$productDetails->addAttributeToFilter('status', 1); 
$productDetails->joinField('is_in_stock',
                            'cataloginventory/stock_item',
                            'is_in_stock',
                            'product_id=entity_id',
                            'is_in_stock=0',
                            '{{table}}.stock_id=1',
                            'left');

0

你可以试试看

 $manageStock = Mage::getStoreConfig(Mage_CatalogInventory_Model_Stock_Item::XML_PATH_MANAGE_STOCK);
        $cond = array(
            '{{table}}.use_config_manage_stock = 0 AND {{table}}.manage_stock=1 AND {{table}}.is_in_stock=0',
            '{{table}}.use_config_manage_stock = 0 AND {{table}}.manage_stock=0',
        );

        if ($manageStock) {
            $cond[] = '{{table}}.use_config_manage_stock = 1 AND {{table}}.is_in_stock=0';
        } else {
            $cond[] = '{{table}}.use_config_manage_stock = 1';
        }

        $collection->joinField(
            'inventory_in_stock',
            'cataloginventory/stock_item',
            'is_in_stock',
            'product_id=entity_id',
            '(' . join(') OR (', $cond) . ')'
        );

或者你可以尝试一下

  $manageStock = Mage::getStoreConfig(Mage_CatalogInventory_Model_Stock_Item::XML_PATH_MANAGE_STOCK);
        $cond = array(
            '{{table}}.use_config_manage_stock = 0 AND {{table}}.manage_stock=1 AND {{table}}.is_in_stock=0',
            '{{table}}.use_config_manage_stock = 0 AND {{table}}.manage_stock=0',
        );

        if ($manageStock) {
            $cond[] = '{{table}}.is_in_stock=0';


        $collection->joinField(
            'inventory_in_stock',
            'cataloginventory/stock_item',
            'is_in_stock',
            'product_id=entity_id',
            '(' . join(') OR (', $cond) . ')'
        );

不确定100%。


谢谢@AmitBera。您能否为您的答案提供一些背景信息,并解释差异?
BrynJ 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.