Làm thế nào để có được sản phẩm bằng cổ phiếu qty?


10

Tôi có đoạn mã sau:

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

Tôi muốn thêm bộ lọc stock qty để lọc các sản phẩm, tôi đã thử:

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

Nhưng không thành công, có ý kiến ​​gì không?

Câu trả lời:


30

Bạn cần tạo một liên kết với bảng cataloginventory / stock_item để có được số lượng tồn kho cho một sản phẩm, bạn có thể sử dụng:

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

ý nghĩa của hàng này '{{bảng}}. stock_id = 1' là gì?
hkguile

1
Nói tóm lại, điều đó có nghĩa là bạn đang tải qty từ mục chứng khoán mặc định. {{bảng}} trong ngữ cảnh này chuyển thành bảng cataloginventory_stock_item và stock_id = 1 chỉ ra rằng đây là mục chứng khoán mặc định.
Daniel Dev Nz

1
Tôi đang làm $coll = Mage::getResourceModel('catalog/product_collection')và sử dụng lĩnh vực tham gia của bạn và addAttributeToFilter. Bộ sưu tập đang tải tốt. Nhưng bộ lọc không hoạt động : ->addAttributeToFilter('qty', array("gt" => 0)). Nhìn vào $coll->getSelect(), không có tài liệu tham khảo qtytrong WHEREmệnh đề. Bất cứ ý tưởng tại sao?
Butussy Butkus

Xin chào @vladimir Cách vượt qua mã trên trong apis xà phòng
shivashankar m

6

MỘT CHIỀU:

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

CÁCH THỨ HAI:

$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

W CÁCH ĐẦU TIÊN 'trong câu trả lời của @TBI Infotech sẽ không hoạt động, vì ->getAllIds()phương thức trả về id chứng khoán, không phải ID sản phẩm. Thay vào đó bạn cần thêm điều này;

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

Logic này rất rõ ràng, đơn giản, không có phép thuật. Tôi tự hỏi làm thế nào hiệu quả / chậm / nhanh là $stock->getProductId()?
ahnbizcad

2

Cách thanh lịch nhất:

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

1

Trả lời muộn, có nhu cầu thực hiện một số công việc về mã này, vì vậy bạn đến đây. Nó chỉ mất một vài lần tham gia, hoạt động cho các sản phẩm có thể cấu hình và đơn giản, chưa được thử nghiệm đối với các gói.

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

Hôm nay tôi có một ngày chậm chạp ... Có phải $ sản phẩm = Mage :: getModel ('core / resource'); và $ product_collection = Mage :: getModel ('danh mục / sản phẩm') -> getCollection ();
Yêu tinh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.