재고 수량으로 제품을 얻는 방법?


10

다음 코드가 있습니다.

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

제품을 필터링하기 위해 재고 수량 필터를 추가하고 싶습니다.

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

그러나 어떤 아이디어도 성공적이지 않습니까?

답변:


30

제품의 재고 수량을 얻으려면 cataloginventory / stock_item 테이블 과 결합을 작성해야 합니다.

$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'의 의미는 무엇입니까?
hkguile

1
즉, 기본 재고 품목에서 수량을로드하고 있음을 의미합니다. 이 컨텍스트에서 {{table}}은 cataloginventory_stock_item 테이블로 변환되며 stock_id = 1은 이것이 기본 재고 항목임을 나타냅니다.
Danny Dev Nz

1
내가하고있어 $coll = Mage::getResourceModel('catalog/product_collection')현장에 가입하여 사용하고 addAttributeToFilter. 컬렉션이 제대로로드 중입니다. 그러나 필터가 작동하지 않습니다 ->addAttributeToFilter('qty', array("gt" => 0)). 를 보면 절 에 대한 $coll->getSelect()참조가 없습니다 . 왜 그런지 알아? qtyWHERE
Buttle Butkus

안녕 @vladimir 비누 API에서 위의 코드를 전달하는 방법
shivashankar m

6

일방 통행:

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

두 번째 방법 :

$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

->getAllIds()메소드가 제품 ID가 아닌 재고 ID를 리턴하므로 @TBI Infotech의 답변에서 'FIRST WAY'가 작동 하지 않습니다. 대신 이것을 추가해야합니다.

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

이 논리는 마법없이 매우 명확하고 단순합니다. 얼마나 효율적 / 느리게 / 빠른지 궁금합니다 $stock->getProductId().
ahnbizcad

2

가장 우아한 방법 :

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

1

늦은 답변,이 코드에 대한 작업을 수행해야 할 필요가 있었으므로 여기로 이동하십시오. 몇 번의 조인이 필요하며 구성 가능하고 간단한 제품에서 작동하며 번들에 대해 테스트되지 않았습니다.

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

나는 오늘 느린 하루를 보내고있다 ... 그것은 $ products = Mage :: getModel ( 'core / resource'); $ product_collection = Mage :: getModel ( 'catalog / product')-> getCollection ();
elfling
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.