Bagaimana cara mendapatkan produk berdasarkan jumlah stok?

10

Saya memiliki kode berikut:

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

Saya ingin menambahkan filter jumlah stok untuk menyaring produk, saya mencoba:

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

Tapi tidak berhasil, ada ide?

hkguile
sumber

Jawaban:

30

Anda perlu membuat gabungan dengan tabel kataloginventory / stock_item untuk mendapatkan jumlah stok suatu produk, Anda bisa menggunakan:

$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
sumber
apa arti dari baris ini '{{table}}. stock_id = 1'?
hkguile
1
Singkatnya itu berarti Anda memuat qty dari item persediaan default. {{table}} dalam konteks ini diterjemahkan ke tabel cataloginventory_stock_item dan stock_id = 1 menunjukkan bahwa ini adalah item persediaan default.
Danny Dev Nz
1
Saya melakukan $coll = Mage::getResourceModel('catalog/product_collection')dan menggunakan bidang gabungan Anda dan addAttributeToFilter. Koleksi ini dimuat dengan baik. Tapi filter tidak bekerja: ->addAttributeToFilter('qty', array("gt" => 0)). Melihat $coll->getSelect(), tidak ada referensi qtydalam WHEREklausa. Ada yang tahu kenapa?
Buttle Butkus
Hai @vladimir Cara memasukkan kode di atas di apis sabun
shivashankar m
6

SATU ARAH:

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

CARA KEDUA:

$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
sumber
3

'CARA PERTAMA' dalam jawaban @TBI Infotech tidak akan berfungsi, karena ->getAllIds()metode ini mengembalikan id persediaan, bukan ID produk. Sebaliknya, Anda perlu menambahkan ini;

$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
sumber
Logika ini sangat jelas, sederhana, tanpa sihir. Saya bertanya-tanya seberapa efisien / lambat / cepatnya $stock->getProductId()?
ahnbizcad
2

Cara paling elegan:

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

Terlambat tiba jawabannya, harus melakukan beberapa pekerjaan pada kode ini, jadi di sini Anda pergi. Hanya membutuhkan beberapa penggabungan, bekerja untuk produk yang dapat dikonfigurasi dan sederhana, belum diuji terhadap bundel.

$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
sumber
Saya mengalami hari yang lambat hari ini ... Apakah $ produk = Mage :: getModel ('core / resource'); dan $ product_collection = Mage :: getModel ('catalog / product') -> getCollection ();
elfling