在庫切れ商品の商品コレクションを取得する方法-addInStockFilterToCollection()の反対?


9

カテゴリーの製品を2つのリストに表示する必要があります。1つは在庫ありアイテム、もう1つは在庫なしアイテムです。

私は使っています

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));

...しかし、これはこれを達成するための唯一の方法または最良の方法ではありませんか?

回答:


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 2017年

2

この例では、「use config」の値は考慮されていません。

仕組みを見てみましょうaddInStockFilterToCollection

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

OK、それは別のメソッドに委譲しています:

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. 製品には、グローバルコンフィギュレーションを使用します、グローバル設定がある場合は、「管理株式= yes」と、在庫があります

次のように条件を反転させる必要があります。

  1. 製品には、グローバルコンフィギュレーションを使用していない、「はい」にセット「の在庫を管理」しているの在庫ではありません

    または

  2. 製品には、グローバルコンフィギュレーションを使用します、グローバルコンフィギュレーションは、「はい=株式の管理」である株式ではありません

説明:in_stockが実際にチェックされる条件のみを取り、比較を0に変更します。in_stockがチェックされない(「在庫の管理」=「いいえ」)条件は、在庫状況に関係なく、製品が常に在庫にあることを意味しますなので、「在庫切れ」クエリには含めません。

次に、これはあなたのコードです:

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

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年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.