Wie bekomme ich Produkte nach Lagermenge?


10

Ich habe folgenden Code:

umask(0);
Mage::app();
$category =new Mage_Catalog_Model_Category();
$category->load($cid);

if ($status == "2") {
    $products = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToSelect('*') 
    ->addFieldToFilter('status',Mage_Catalog_Model_Product_Status::STATUS_DISABLED);
    $products->load();
}

if ($status == "1") {
    $products = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToSelect('*');
    $products->load();  
}

Ich möchte einen Filter für die Lagermenge hinzufügen, um die Produkte zu filtern. Ich habe versucht:

    $products = Mage::getModel('catalog/product')->getCollection()
        ->addAttributeToSelect('*');
    **->addAttributeToFilter('qty', array("gt" => 0));**

Aber nicht erfolgreich, irgendwelche Ideen?

Antworten:


30

Sie müssen einen Join mit der Tabelle cataloginventory / stock_item erstellen , um die Bestandsmenge für ein Produkt zu erhalten, die Sie verwenden können:

$collection = Mage::getModel('catalog/product')
     ->getCollection()
     ->addAttributeToSelect('*')
     ->joinField('qty',
         'cataloginventory/stock_item',
         'qty',
         'product_id=entity_id',
         '{{table}}.stock_id=1',
         'left'
     )->addAttributeToFilter('qty', array('gt' => 0));

Was bedeutet diese Zeile '{{table}}. stock_id = 1'?
Hkguile

1
Kurz gesagt bedeutet dies, dass Sie die Menge aus dem Standardbestand laden. {{table}} wird in diesem Zusammenhang in die Tabelle cataloginventory_stock_item übersetzt, und stock_id = 1 gibt an, dass dies der Standardbestand ist.
Danny Dev Nz

1
Ich mache $coll = Mage::getResourceModel('catalog/product_collection')und benutze dein Join-Feld und addAttributeToFilter. Die Sammlung wird gut geladen. Aber der Filter funktioniert nicht : ->addAttributeToFilter('qty', array("gt" => 0)). Mit Blick auf $coll->getSelect(), gibt es keinen Hinweis auf qtydie WHEREKlausel. Irgendeine Idee warum?
Buttle Butkus

Hallo @vladimir Wie über Code in Seife apis übergeben
shivashankar m

6

EINWEG:

$stockIds = Mage::getModel('cataloginventory/stock_item')
    ->getCollection()
    ->addQtyFilter('=', 30) //can be ->addQtyFilter('>=', 30), depending on requirement
    ->getAllIds();

$products = Mage::getModel('catalog/product')
    ->getCollection()
    ->addIdFilter($stockIds)
    ->setPageSize(10);

ZWEITER WEG:

$oCollection = Mage::getModel('catalog/product')
->getCollection()
->joinField(
    'qty',
    'cataloginventory/stock_item',
    'qty',
    'product_id=entity_id',
    '{{table}}.stock_id=1',
    'left'
)
->addAttributeToFilter('qty', array('eq' => 30));

3

Der 'ERSTE WEG' in der Antwort von @TBI Infotech funktioniert nicht, da die ->getAllIds()Methode die Bestands-ID und nicht die Produkt-ID zurückgibt. Stattdessen müssen Sie dies hinzufügen.

$stockIds = Mage::getModel('cataloginventory/stock_item')
->getCollection()
->addQtyFilter('>=', 30); 
//->getAllIds();

foreach($stockIds as $stock) {
   $idarray[] = $stock->getProductId();
}

$products = Mage::getModel('catalog/product')
->getCollection()
->addIdFilter($idarray)
->setPageSize(10);

Diese Logik ist sehr klar, einfach und ohne Magie. Ich frage mich, wie effizient / langsam / schnell ist $stock->getProductId()?
Ahnbizcad

2

Eleganteste Art:

$products = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToSelect('*');
Mage::getSingleton('cataloginventory/stock')
    ->addInStockFilterToCollection($products);

1

Spät ankommende Antwort, musste allerdings etwas an diesem Code arbeiten, also los geht's. Es sind nur wenige Verknüpfungen erforderlich, funktioniert für konfigurierbare und einfache Produkte und wurde nicht gegen Bundles getestet.

$product_collection->getSelect()->joinLeft(
        array(
            'css1' => $products->getTable('cataloginventory/stock_status')
        ),
        'e.entity_id = css1.product_id and css1.stock_id =1 AND css1.website_id='.Mage::app()->getWebsite()->getId(),
        ''
    )->joinLeft(
        array(
            'cpsl' => $products->getTable('catalog/product_super_link')
        ),
        'cpsl.parent_id = e.entity_id',
        ''
    )->joinLeft(
        array(
            'css2' => $products->getTable('cataloginventory/stock_status')
        ),
        'css2.product_id = cpsl.product_id and css1.stock_id =1 AND css1.website_id='.Mage::app()->getWebsite()->getId(),
        ''
    )->joinLeft(
        array(
            'cpei' => 'catalog_product_entity_int'
        ),
        "cpei.entity_id = cpsl.product_id AND cpei.entity_type_id = $entity_type_id and cpei.attribute_id = $attribute_id AND (cpei.value IS NULL OR cpei.value = " . Mage_Catalog_Model_Product_Status::STATUS_ENABLED . ")",
        ''
    )->group(
        'e.entity_id'
    )->columns(
        array(
            'qty' => new Zend_Db_Expr ("IF(`e`.`type_id` = 'simple', `css1`.qty, sum(css2.qty))")
        )
    )->having(
        'qty > 0'
);

Ich habe heute einen langsamen Tag ... Ist es $ products = Mage :: getModel ('core / resource'); und $ product_collection = Mage :: getModel ('catalog / product') -> getCollection ();
Elfling
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.