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?

hkguile
quelle

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));
Vladimir Kerkhoff
quelle
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));
TBI Infotech
quelle
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);
pixiemedia
quelle
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);
fbtb
quelle
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'
);
Richard
quelle
Ich habe heute einen langsamen Tag ... Ist es $ products = Mage :: getModel ('core / resource'); und $ product_collection = Mage :: getModel ('catalog / product') -> getCollection ();
Elfling