我刚刚开始使用Magento,尤其是模型和ORM如何工作。
我使用过这三种方法
Mage::getResourceModel()
Mage::getModel()
Mage::getSingleton()
有谁能告诉我每个人之间的区别是什么?
我发现getSingleton()
共享内存,getModel()
为正在加载的同一个表的新对象使用新内存。
我使用了上述所有方法但无法区分它们以及何时适合使用哪种方法。
答案 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