Stok adet tarafından ürünleri almak için nasıl?


10

Takip koduna sahibim:

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

Ürünleri filtrelemek için stok adet filtresi eklemek istiyorum, denedim:

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

Ama başarılı değil, herhangi bir fikir?

Yanıtlar:


30

Bir ürünün stok miktarını almak için cataloginventory / stock_item tablosuyla birleştirme oluşturmanız gerekir , şunları kullanabilirsiniz:

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

'{{table}}. stock_id = 1' satırının anlamı nedir?
hkguile

1
Kısacası, bu miktarı varsayılan stok kaleminden yüklediğiniz anlamına gelir. Bu bağlamda {{table}}, cataloginventory_stock_item tablosuna çevrilir ve stock_id = 1, bunun varsayılan stok öğesi olduğunu belirtir.
Danny Dev Nz

1
$coll = Mage::getResourceModel('catalog/product_collection')Birleştirme alanınızı yapıyorum ve kullanıyorum ve addAttributeToFilter. Koleksiyon gayet iyi yükleniyor. Ama filtre çalışmıyor: ->addAttributeToFilter('qty', array("gt" => 0)). Baktığımızda , maddede $coll->getSelect()atıf yok . Neden olduğu hakkında bir fikrin var mı? qtyWHERE
Buttle Butkus

Merhaba @vladimir Sabun apis kodu yukarıda geçmek için
shivashankar m

6

TEK YÖN:

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

İKİNCİ YOL:

$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

@TBI Infotech'in cevabındaki 'İLK YOL' ->getAllIds()yöntemi , yöntem ürün kimliğini değil stok kimliğini döndürdüğü için çalışmaz. Bunun yerine bunu eklemeniz gerekir;

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

Bu mantık sihirsiz, çok açık, basittir. Acaba ne kadar verimli / yavaş / hızlı $stock->getProductId()?
ahnbizcad

2

En zarif yol:

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

1

Geç gelen cevap, olsa da, bu kod üzerinde bazı işler yapmak için bir ihtiyaç vardı, işte burada. Sadece birkaç birleşim alır, yapılandırılabilir ve basit ürünler için çalışır, paketlere karşı test edilmemiştir.

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

Bugün yavaş bir gün geçiriyorum ... $ products = Mage :: getModel ('core / resource'); ve $ product_collection = Mage :: getModel ('katalog / ürün') -> getCollection ();
Elfling
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.