Подтвердить что ты не робот

Magento - когда использовать Mage:: getResourceModel и Mage:: getModel

Я только начал использовать Magento и, в частности, о том, как работают модели и ORM.

Я использовал эти три метода

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

Может ли кто-нибудь сказать мне, какая разница между каждым из них?

Я обнаружил, что getSingleton() разделяет память, а getModel() использует новую память для нового объекта для той же загружаемой таблицы.

Я использовал все вышеприведенные методы, но не мог различать их, и когда целесообразно использовать какой-либо.

4b9b3361

Ответ 1

Отличный различие с примером для getingleton и getmodel.

Mage:: getSingleton()

Mage:: getSingleton() сначала проверит, существует ли тот же экземпляр класса или нет в памяти. Если экземпляр существует, он возвращает тот же объект из памяти. Итак, Mage:: getSingleton() быстрее, чем Mage:: getModel().

Пример

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

$product1 и $product2 оба будут использовать одну и ту же память ОС и возвращать только один экземпляр каждый раз.

Mage:: getModel()

Mage:: getModel() будет создавать новый экземпляр объекта каждый раз, даже если такой объект существует в конфигурации.

Пример

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

$product1 и $product2 оба имеют разный момент одного и того же объекта и также занимают разную память

Mage:: getResourceModel()

Насколько я знаю, все коллекции в Magento - это модели ресурсов. Они создаются с помощью

Mage::getResourceModel() 

или

Mage::getModel()->getCollection()

На самом деле не имеет значения, какую функцию вы используете; последний просто вызывает первый. Команда Magento просто решила сделать коллекцию частью ресурса, вероятно, потому что коллекции требуют много запросов к базе данных. Обычно вам не нужно вызывать Mage::getResourceModel() для чего угодно, кроме коллекций.

хороший пост by balajimca

Ответ 2

Кроме того, если вы знаете, какие атрибуты вам нужны, то использование Mage:: getResourceModel с фильтрами будет ~ 5 раз более эффективным как в скорости, так и в памяти, чем загрузка через mage:: getModel ('catalog/product').

например. Метод 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