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

use*_*068 28 magento

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

我用过这三种方法

Mage::getResourceModel()
Mage::getModel()
Mage::getSingleton()
Run Code Online (Sandbox Code Playgroud)

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

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

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

Sam*_*Sam 45

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

法师:: getSingleton()

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

$product1 = Mage::getSingleton('catalog/product');
$product2 = Mage::getSingleton('catalog/product');
Run Code Online (Sandbox Code Playgroud)

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

法师:: getModel()

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

$product1 = Mage::getModel('catalog/product');
$product2 = Mage::getModel('catalog/product');
Run Code Online (Sandbox Code Playgroud)

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

法师:: getResourceModel()

据我所知,Magento的所有藏品都是资源模型.它们被实例化

Mage::getResourceModel() 
Run Code Online (Sandbox Code Playgroud)

要么

Mage::getModel()->getCollection()
Run Code Online (Sandbox Code Playgroud)

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

balajimca的好帖子

  • 上帝为这个解释祝福你的灵魂. (8认同)

Ben*_*ani 9

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

例如,从db中检索产品的getResourceModel方法

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

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

Mage::getModel('catalog/product')->load($productId);
Run Code Online (Sandbox Code Playgroud)

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