2014-01-16 54 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

相关问题