Comment obtenir des produits par quantité en stock?

10

J'ai le code suivant:

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

Je souhaite ajouter un filtre de stock pour filtrer les produits, j'ai essayé:

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

Mais pas réussi, des idées?

hkguile
la source

Réponses:

30

Vous devez créer une jointure avec la table cataloginventory / stock_item pour obtenir la quantité de stock d'un produit, vous pouvez utiliser:

$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
la source
quelle est la signification de cette ligne '{{table}}. stock_id = 1'?
hkguile
1
En bref, cela signifie que vous chargez la quantité à partir du stock par défaut. {{table}} dans ce contexte se traduit par la table cataloginventory_stock_item et stock_id = 1 indique qu'il s'agit du stock par défaut.
Danny Dev Nz
1
Je fais $coll = Mage::getResourceModel('catalog/product_collection')et utilise votre champ de jointure et addAttributeToFilter. La collection se charge très bien. Mais le filtre ne fonctionne pas: ->addAttributeToFilter('qty', array("gt" => 0)). En regardant $coll->getSelect(), il n'y a aucune référence à qtyl' WHEREarticle. Une idée pourquoi?
Buttle Butkus
Salut @vladimir Comment passer le code ci-dessus dans les
API de
6

UNE MANIÈRE:

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

DEUXIÈME VOIE:

$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
la source
3

La «PREMIÈRE FAÇON» dans la réponse de @TBI Infotech ne fonctionnera pas, car la ->getAllIds()méthode renvoie l'ID du stock, pas l'ID du produit. Au lieu de cela, vous devez ajouter ceci;

$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
la source
Cette logique est très claire, simple, sans magie. Je me demande quelle est l'efficacité / lent / rapide $stock->getProductId()?
ahnbizcad
2

La manière la plus élégante:

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

Réponse tardive, j'avais cependant besoin de travailler sur ce code, alors allez-y. Il ne prend que quelques jointures, fonctionne pour des produits configurables et simples, n'a pas été testé par rapport aux bundles.

$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
la source
J'ai une journée lente aujourd'hui ... Est-ce $ products = Mage :: getModel ('core / resource'); et $ product_collection = Mage :: getModel ('catalogue / produit') -> getCollection ();
elfling