2013-01-16 41 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