Magento-何时使用Mage :: getResourceModel和Mage :: getModel

时间:2014-01-16 05:26:06

标签: magento

我刚刚开始使用Magento,尤其是模型和ORM如何工作。

我使用过这三种方法

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

有谁能告诉我每个人之间的区别是什么?

我发现getSingleton()共享内存,getModel()为正在加载的同一个表的新对象使用新内存。

我使用了上述所有方法但无法区分它们以及何时适合使用哪种方法。

2 个答案:

答案 0 :(得分:44)

与getsingleton和getmodel的示例完美区别。

<强>法师:: getSingleton()

Mage :: getSingleton()将首先检查内存中是否存在相同的类实例。如果实例存在,那么它将从内存中返回相同的对象。所以Mage :: getSingleton()比Mage :: getModel()快。

实施例

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

$ product1和$ product2都将共享相同的操作系统内存,每次只返回一个实例。

<强>法师:: getModel()

Mage :: getModel()每次在配置中都存在这样的对象时,都会创建一个对象的新实例。

实施例

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

$ product1和$ product2都具有相同对象的不同瞬间,并且还占用不同的内存

<强>法师:: getResourceModel()

据我所知,Magento的所有藏品都是资源模型。它们由

实例化
Mage::getResourceModel() 

Mage::getModel()->getCollection()

使用哪种功能并不重要;后者只是称第一个。 Magento团队只是选择将集合作为资源的一部分,可能是因为集合需要对数据库进行大量查询。通常,您不必为集合之外的任何其他内容调用Mage::getResourceModel()

balajimca的好帖子

答案 1 :(得分:7)

此外,如果你知道你需要什么属性,那么使用带过滤器的Mage :: getResourceModel在速度和内存方面的效率比通过Mage :: getModel(&#39; catalog / product&#39;)加载高出约5倍。

e.g。 getResourceModel从db

中检索产品的方法
$collection = Mage::getResourceModel('catalog/product_collection')
    ->addFieldToFilter('entity_id', array($productId))
    ->addAttributeToSelect(array('name'))
    ->setPageSize(1);
$product = $collection->getFirstItem();

加载模型(这将加载所有eav属性)

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

[更多信息] [1] http://alanstorm.com/magento_advanced_orm_entity_attribute_value_part_1