1

次に、あるカテゴリの特定の製品の価格で製品のコレクションを取得する必要があります。例:私は製品White Shoesを持っています、それはのカテゴリーにあります。次の5つの商品は、靴のカテゴリ白い靴よりも高価格で、5つの商品は低価格である必要があります。

ご協力いただきありがとうございます!

4

2 に答える 2

4

これはおそらく効率の観点からクリーンアップすることができますが、うまくいけば、その要点を理解することができます。設定する必要のある変数は2つあります。1つはオブジェクトとしての$productWhiteShoes製品であり、もう1つはオブジェクトとしてのShoesカテゴリです。Mage_Catalog_Model_Product$categoryMage_Catalog_Model_Category

アップデート

これは、の製品コレクション全体をロードせずにそれを行うためのより良い方法です$category

// Load up to 5 products with price <= $product
$fiveLower = Mage::getModel('catalog/product')->getCollection()
    // Add whatever attributes you want here
    ->addAttributeToSelect(array(
        'name',
        'product_url',
        'small_image',
    ))

    // $category is an instance of Mage_Catalog_Model_Category
    ->addCategoryFilter($category)

    // Both of these are required to get the price
    ->addMinimalPrice()
    ->addFinalPrice()

    // Filter out the current product by id
    ->addAttributeToFilter('entity_id', array('neq' => $product->getId()));

// Filter by final_price <= $product and limit to 5.
$fiveLower->getSelect()
          ->having('final_price <= ?', $product->getFinalPrice())
          ->order('final_price')
          ->limit(5, 0);

// Load up to 5 products with price > $product
$fiveHigher = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToSelect(array(
        'name',
        'product_url',
        'small_image',
    ))
    ->addCategoryFilter($category)
    ->addMinimalPrice()
    ->addFinalPrice();

$fiveHigher->getSelect()
           ->having('final_price > ?', $product->getFinalPrice())
           ->order('final_price')
           ->limit(5, 0);

echo 'These are the lower priced items:' . PHP_EOL;
foreach ($fiveLower as $item) {
    echo $item->getName() . ' - ' . $item->getFinalPrice() . PHP_EOL;
}

echo 'These are the higher priced items:' . PHP_EOL;
foreach ($fiveHigher as $item) {
    echo $item->getName() . ' - ' . $item->getFinalPrice() . PHP_EOL;
}
于 2012-05-31T14:37:33.820 に答える
1

私は同様の仕事をしました、そしてここで私がしたこと:

        $customerGroupId = Mage::helper('customer')->getCustomer()->getGroupId();
        $websiteId = Mage::app()->getStore()->getWebsiteId();
        $finalPrice = $product->getFinalPrice();

        $coreResource = Mage::getSingleton('core/resource');
        $adapter = $coreResource->getConnection('catalog_read');
        $prevSelect = $adapter->select()
            ->from(array('i' => $coreResource->getTableName('catalog/product_index_price')), array())
            ->join(
                array('p' => $coreResource->getTableName('catalog/category_product')),
                'p.product_id = i.entity_id',
                array('product_id')
            )
            ->where('p.category_id = ?', $categoryId)
            ->where('i.customer_group_id = ?', $customerGroupId)
            ->where('i.website_id = ?', $websiteId)
            ->where('p.product_id != ?', $product->getId())
            ->where('i.final_price < ?', $finalPrice)
            ->order('i.final_price DESC')
            ->limit(self::PRODUCTS_BLOCK_SIZE);

        $lowerIds = array_reverse($adapter->fetchCol($prevSelect));

        $nextSelect = $adapter->select()
            ->from(array('i' => $coreResource->getTableName('catalog/product_index_price')), array())
            ->join(
                array('p' => $coreResource->getTableName('catalog/category_product')),
                'p.product_id = i.entity_id',
                array('product_id')
            )
            ->where('p.category_id = ?', $categoryId)
            ->where('i.customer_group_id = ?', $customerGroupId)
            ->where('i.website_id = ?', $websiteId)
            ->where('p.product_id != ?', $product->getId())
            ->where('i.final_price > ?', $finalPrice)
            ->order('i.final_price ASC')
            ->limit(self::PRODUCTS_BLOCK_SIZE);

        $higherIds = $adapter->fetchCol($nextSelect);

        $lowerSliced = array_slice($lowerIds, -self::PRODUCTS_BLOCK_SIZE);
        $requiredFromHigher = self::PRODUCTS_BLOCK_SIZE - count($lowerSliced);
        $similarIds = array_merge(
            $lowerSliced,
            array_slice($higherIds, 0, $requiredFromHigher)
        );

        $collection = Mage::getResourceModel('catalog/product_collection')
            ->addAttributeToSelect('name')
            ->addAttributeToSelect('small_image')
            ->addAttributeToSelect('product_url')
            ->addAttributeToFilter('entity_id', array('in' => $similarIds))
            ->setPage(1, self::PRODUCTS_BLOCK_SIZE);
于 2012-06-07T07:05:24.537 に答える