2013-01-16 40 views
3

我想获得产品价格和描述在Magento不同的商店明智的获取产品价格和描述,我可以做到这一点,如下所示: -通过专卖店在Magento

foreach ($productObj->getStoreIds() as $_storeId) { 
       $tempStoreObj = new Mage_Core_Model_Store(); 
       $tempStoreObj->load($_storeId); 

       $tempProductObj = new Mage_Catalog_Model_Product(); 
       $tempProductObj->setStoreId($_storeId); 
       $tempProductObj->load($productObj->getId()); 


       $tempPriceArray[] = array(
        'websiteId' => $tempStoreObj->getWebsiteId(), 
        'price' => $tempProductObj->getPrice(), 
        'baseCurrency' => $tempStoreObj->getBaseCurrencyCode(), 
       ); 
       $tempDescArray[]=array(
       'descprition' => $tempProductObj->getData('description'), 
       'shortDescription' => $tempProductObj->getData('short_description'), 
       ); 

      } 

现在在上面的代码中有,我第一次提取特定产品的商店,然后加载商店,然后再次创建一个对象的产品和加载编号产品编号商店编号,这样我就完成了所需的任务。

现在我的问题从这里开始,当有许多产品和许多商店的性能问题出现,并且加载过程使这种缓慢。

有没有其他方法实现相同?

回答

0

当您想要从几种产品中获得此信息时,您可以采取的一项措施是使用产品集合,因此只有一个数据库查询会为每个商店获取所有产品的信息。

那么这将是这个样子:

$storeId = 1; // Current Store you want to look at 
$productIds = array(10,15,26); // Enter your Ids 
$product = Mage::getModel('catalog/product'); 
$products = $product->getCollection() 
       ->addStoreFilter($storeId) 
       ->addAttributeToFilter('entity_id', array('in' => $productIds)) 
       ->addAttributeToSelect('price') 
       ->addAttributeToSelect('description'); 

然后遍历所有的产品:

$currPrices = array(); 
foreach ($products as $prod) { 
    $currPrices[$prod->getId()] = $prod->getPrice(); 
} 

要清楚的几家店:

$currPrices = array(); 
$currDescriptions = array(); 
foreach ($productObj->getStoreIds() as $_storeId) { 
    $productIds = array(10,15,26); // Enter your Ids 
    $product = Mage::getModel('catalog/product'); 
    $products = $product->getCollection() 
        ->addStoreFilter($_storeId) 
        ->addAttributeToFilter('entity_id', array('in' => $productIds)) 
        ->addAttributeToSelect('price') 
        ->addAttributeToSelect('description'); 

    foreach ($products as $prod) { 
     $currPrices[$_storeId][$prod->getId()] = $prod->getPrice(); 
     $currDescriptions[$_storeId][$prod->getId()] = $prod->getDescription(); 
    } 
} 
+0

是的,你是对的,但我需要不同的stores.ie所有可用的价格。如果有三个商店,我需要在不同的商店所有三个价格,因此我不能过滤wrt store_id在我的收藏 – chanz

+0

@chanz那么,你可以做三时间的集合,所以你有3个查询,而不是做每个产品的时间每个商店一次查询,这是我的建议:) – mpaepper

+0

@chanz澄清,增加了多商店的方式 – mpaepper

-2

最快方式是直接查询(当然,包装到Zend_Db_Select)来存储和产品表。

BASE_CURRENCY可以从core_config_data

产品价格来获得可在catalog_category_product_index找到

在catalog_product_entity_text描述

查找到

Mage_Reports_Model_Resource_Product_Index_Abstract 
Mage_Reports_Model_Resource_Report_Product_Viewed_Collection 
Mage_Reports_Model_Resource_Report_Product_Viewed 
Mage_Reports_Model_Resource_Quote_Collection 

Magento会用Zend_Db_Select对象,甚至取的方法适配器,而不是集合,以防查询速度加快。

+0

我不想使用原始查询。 .. – chanz

+0

通过直接SQL脚本处理数据通常是一个坏主意,当你有一个好的ORM系统并提供CRUD时(这是Magento的情况)。 –

+1

俞真有把握吗? ;)如果性能是目标,那么SQL查询将不会更快。是的,例如,需要将它们封装到Zend_Db_Select对象或使用PDO,但这样做的确会比Magento加载和收集更快。举个例子 - 尝试加载10 000个Magento物品。如果您不信任这一点 - 请以Mage_Reports_Model_Resource_Report_Product_Viewed_Collection为例。为什么Magento使用$ adapter-> select()(Zend_Db_Select)而不是它的集合? ;)表现就是答案。 – freento