กรองการรวบรวมผลิตภัณฑ์ตามคุณลักษณะผลิตภัณฑ์ย่อย


9

ฉันมีสถานการณ์เช่น 2 คุณลักษณะซึ่งกำหนดให้กับผลิตภัณฑ์เด็ก

1) person_height_fromและ 2) person_height_toซึ่งมีแอตทริบิวต์ประเภทDropDown

ซึ่งกำหนดให้เฉพาะในผลิตภัณฑ์สำหรับเด็ก แต่ไม่ได้กำหนดในผลิตภัณฑ์หลัก

ฉันต้องการกรองชุดผลิตภัณฑ์ในหน้าหมวดหมู่ด้วยแอตทริบิวต์นี้

ชอบ length = 175

 $collection->addAttributeToFilter('person_height_from', array('lteq' => $length));

 $collection->addAttributeToFilter('person_height_to', array('gteq' => $length));

เป็นไปได้ไหมที่จะรับเฉพาะผลิตภัณฑ์แม่ในหน้าหมวดหมู่ที่ผลิตภัณฑ์ย่อยกำหนดค่าไว้ด้านบน

ความช่วยเหลือของคุณจะได้รับการชื่นชม

คำตอบ:


0

กรุณาใช้รหัสด้านล่าง:

$collection = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToFilter(
        array(
            array('attribute'=> 'length', 'like' => '175')
        )
    );

$collection->getSelect()
    ->joinLeft(
        array('link_table' => 'catalog_product_super_link'),
        'link_table.product_id = e.entity_id',
        array('product_id', 'parent_id')
    );

$collection->getSelect()->group('link_table.parent_id');

foreach ($collection as $product) {
    $productIds[] = $product->getParentId();
}

$productCollection = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToFilter('entity_id', array('in' => $productIds));

ในรหัสข้างต้นก่อนอื่นฉันพบผลิตภัณฑ์สำหรับเด็กที่มีความยาวคือ 175 หลังจากนั้นฉันพบรหัสหลักที่เกี่ยวข้องกับผลิตภัณฑ์สำหรับเด็กแล้วกรองการรวบรวมผลิตภัณฑ์ตามรหัสผลิตภัณฑ์หลัก


1
เป็นไปได้ที่จะทำในแบบสอบถามเพียง 1 sql ฉันมีมากกว่า 1 lac สินค้าในร้านจะมีผลอย่างมากต่อประสิทธิภาพในการรับชุดนี้ :(
liyakat

0

ที่นี่ฉันทำกับ 2 คุณลักษณะของผลิตภัณฑ์เด็กเพื่อค้นหาด้วยแบบสอบถามภายใน

$collection = $observer->getEvent()->getCollection();

// check if  query is already in sql then no need to add per event
$cloneSelect = clone $collection->getSelect();
$wherePart = $cloneSelect->getPart(Zend_Db_Select::WHERE);
$excludedWherePart = 'AND (e.entity_id IN';
foreach ($wherePart as $key => $wherePartItem) {
    if (strpos($wherePartItem, $excludedWherePart) !== false) {
        return $this;
    }
}

$resource = Mage::getSingleton('core/resource');
$_readAdapter = $resource->getConnection('core_read');
$status = Mage::getSingleton('catalog/config')->getAttribute('catalog_product', 'status');
$heightTo = Mage::getSingleton('catalog/config')->getAttribute('catalog_product', 'person_height_to');
$heightFrom = Mage::getSingleton('catalog/config')->getAttribute('catalog_product', 'person_height_from');
$categoryId = Mage::registry("current_category")->getId();
$storeId = Mage::app()->getStore()->getId();

$query = $_readAdapter->select()
    ->from(array('e' => $collection->getTable('catalog/product')),array())
    ->joinInner(array(
        'at_status' => $status->getBackendTable()),
        'at_status.entity_id = e.entity_id AND at_status.store_id = 0 AND at_status.attribute_id = ' .$status->getAttributeId(),
        array()
    )
    ->joinInner(array(
        'at_stock' => $resource->getTableName('cataloginventory/stock_item')),
        'at_stock.product_id = e.entity_id AND at_stock.is_in_stock = ' . 1,
        array()
    )
    ->joinInner(array(
        'cat_index' => $collection->getTable('catalog/category_product_index')),
        'cat_index.product_id = e.entity_id AND cat_index.store_id = ' . $storeId . ' AND cat_index.category_id = ' . $categoryId,
        array()
    )
    ->joinInner(array(
        'at_person_height_to' => $heightTo->getBackendTable()),
        'at_person_height_to.entity_id = e.entity_id AND at_person_height_to.store_id = 0 AND at_person_height_to.attribute_id = ' . $heightTo->getAttributeId(),
        array()
    )
    ->joinInner(array(
        'at_person_height_from' => $heightTo->getBackendTable()),
        'at_person_height_from.entity_id = e.entity_id AND at_person_height_from.store_id = 0 AND at_person_height_from.attribute_id = ' . $heightFrom->getAttributeId(),
    array()
    )
    ->where(
        "e.type_id = 'simple' AND at_person_height_from.value <= " . $length . " AND at_person_height_to.value >= " . $length
    )
    ->join(
        array('link_table' => 'catalog_product_super_link'),
        'link_table.product_id = e.entity_id', array('parent_id')
    );

$productIds =  array_map('intval', array_unique($_readAdapter->fetchCol($query)));

// add filter here with parent ids
$collection->addAttributeToFilter('entity_id', array('in' => $productIds));

หวังว่าสิ่งนี้จะช่วยให้ผู้อื่นและได้รับแนวคิดที่ดีขึ้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.