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?

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

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

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

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

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

Saya mengalami hari yang lambat hari ini ... Apakah $ produk = Mage :: getModel ('core / resource'); dan $ product_collection = Mage :: getModel ('catalog / product') -> getCollection ();
elfling
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.