2014-01-16 59 views
22

我剛開始使用Magento,尤其是模型和ORM如何工作。Magento-何時使用Mage :: getResourceModel和Mage :: getModel

我用這三種方法

Mage::getResourceModel() 
Mage::getModel() 
Mage::getSingleton() 

誰能告訴我,不同的是他們每個人之間?

我發現getSingleton()共享內存,而getModel()爲正在加載的同一張表的新對象使用新內存。

我已經使用了上面的所有方法,但無法區分它們,以及何時適合使用哪一個。

回答

37

與getsingleton和getmodel的示例完美的區別。

法師:: getSingleton()

法師:: getSingleton()將首先檢查是否同一類的實例在存儲器存在與否。如果實例存在,那麼它將從內存中返回相同的對象。所以Mage :: getSingleton()比Mage :: getModel()更快。

$product1 = Mage::getSingleton('catalog/product'); 
$product2 = Mage::getSingleton('catalog/product'); 

$產品1和$產品2二者將共享操作系統的同一內存並返回每次只有一個實例。

法師:: getModel()

法師:: getModel()將創建一個對象每次甚至這樣的對象在配置存在的一個新實例。

$product1 = Mage::getModel('catalog/product'); 
$product2 = Mage::getModel('catalog/product'); 

$產品1和$產品2都具有相同對象的不同瞬間,也據我所知佔據不同的內存

法師:: getResourceModel()

,Magento中的所有集合都是資源模型。它們由

Mage::getResourceModel() 

Mage::getModel()->getCollection() 

它並不真正無論哪個功能,您使用的實例;後者簡單地稱爲第一個。 Magento團隊只是選擇將集合作爲資源的一部分,可能是因爲集合需要查詢數據庫。通常情況下,您無需致電Mage::getResourceModel()查詢集合以外的任何內容。

好後由balajimca

+6

神保佑你的靈魂爲這個解釋。 – ahnbizcad

3

另外,如果你知道你需要然後用法師:: getResourceModel帶過濾器的哪些屬性是5倍〜在速度比通過加載更有效的記憶說法師:: getModel('目錄/產品')。

例如從DB檢索產品

$collection = Mage::getResourceModel('catalog/product_collection') 
    ->addFieldToFilter('entity_id', array($productId)) 
    ->addAttributeToSelect(array('name')) 
    ->setPageSize(1); 
$product = $collection->getFirstItem(); 

負荷模型的 getResourceModel方法(這將加載所有EAV屬性)

Mage::getModel('catalog/product')->load($productId); 

[更多這裏資料] [1] http://alanstorm.com/magento_advanced_orm_entity_attribute_value_part_1

相關問題