我最近在調用大型產品集合時使用Magento的資源迭代器模型以節省資源 - http://www.fontis.com.au/blog/magento/loading-large-collections。然而,我發現很難弄清楚如何讓它輸出完全相同的數據。在產品集合上使用Magento的資源迭代器模型
因此,假設我使用下面的獲得完整的產品採集和輸出的SKU:
$productCollection = Mage::getModel('catalog/product')->getCollection();
foreach($productCollection as $product){
echo $product->getSku().',';
}
使用Profiler,我看這是使用1154480個字節來處理。
現在使用資源模型迭代器,像這樣:
function productCallback($args)
{
$product = Mage::getModel('catalog/product');
$product->setData($args['row']);
echo $product->getSku().',';
}
$_productCollection = Mage::getModel('catalog/product')->getCollection();;
$_productCollection = Mage::getSingleton('core/resource_iterator')->walk($_productCollection->getSelect(), array('productCallback'));
這使用199912個字節。因此,獲得同樣的東西非常重要,只是sku的基本列表。
但我的問題是,例如,如果我想使產品一個很好的樣式列表,並得到他們的圖片,網址等,我將以前使用foreach循環在$ productCollection,如在第一個例子:
foreach($_productCollection as $product){
echo $product->getSku().',';
};
但是,這不再起作用。它看起來像通過回調時,它的行爲與foreach循環相同,依次運行每個產品。
那麼,如何讓我的集合恢復到與之前相同的格式,因此它再次在foreach循環中工作?我需要將產品添加到數組嗎?如果是這樣,我該怎麼做?
的事情是,如果我想要的產品集合說最好 - 我不希望它緩存,因爲它不會實時更新。但是我說我只想要4種產品,即使我只是指定要返回4種產品的圖像,名稱,價格等,它仍然貫穿整個系列。所以,我想如果我只是使用資源迭代器來獲取4個必需的sku,那麼在foreach循環中,我可以使用sku來加載我需要的4個產品的數據。 –
在暢銷書的情況下,我會說你仍然應該緩存輸出,但是有一個受訂單影響的緩存標籤。當訂單被放置(出售物品),然後刷新呈現的輸出。 – clockworkgeek
如果您可以按照已售出的數量過濾產品收集,那麼您可以避免遍歷整個收集。首先在SQL中執行,以免在PHP中完成。您目前如何衡量銷售量? – clockworkgeek