2014-01-16 9 views
22

Ich habe gerade begonnen, Magento zu verwenden, und insbesondere auf, wie Modelle und das ORM funktionieren.Magento-wann zu verwenden Mage :: getResourceModel und Mage :: getModel

Ich habe diese drei Methoden

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

Kann mir jemand sagen, was ist der Unterschied zwischen jedem von ihnen verwendet?

Ich habe festgestellt, dass getSingleton() Shares Speicher während getModel() verwendet neuen Speicher für neues Objekt für die gleiche Tabelle geladen wird.

Ich habe alle oben genannten Methoden verwendet, konnte aber nicht zwischen ihnen unterscheiden und wann es sinnvoll ist, welche zu verwenden.

Antwort

37

Perfect Unterschied mit Beispiel für GetSingleton und GetModel.

Mage :: getSingleton()

Mage :: getSingleton() wird zunächst prüfen, ob die gleiche Klasseninstanz oder nicht im Speicher vorhanden ist. Wenn die Instanz existiert, wird das gleiche Objekt aus dem Speicher zurückgegeben. Also ist Mage :: getSingleton() schneller als Mage :: getModel().

Beispiel

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

$ product1 und beide $ product2 wird denselben Speicher von OS gemeinsam nutzen und nur eine Instanz jedes Mal zurück.

Mage :: getModel()

Mage :: getModel() wird eine neue Instanz eines Objekts erstellen jedes Mal auch eine solche Aufgabe in der Konfiguration vorhanden ist.

Beispiel

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

$ product1 und beide haben $ product2 verschiedenen Instant von demselben Objekt und auch besetzen verschiedene Speicher

Mage :: getResourceModel()

Soweit ich weiß, Alle Sammlungen in Magento sind Ressourcenmodelle. Sie werden instanziiert von

Mage::getResourceModel() 

oder

Mage::getModel()->getCollection() 

Es spielt keine Rolle, die Sie funktionieren verwenden; Letzterer nennt einfach den ersten. Das Magento-Team entschied sich einfach dazu, die Sammlungen zu einem Teil der Ressource zu machen, wahrscheinlich weil die Sammlungen die Datenbank viel abfragen müssen. Normalerweise müssen Sie Mage::getResourceModel() für alles andere als Sammlungen aufrufen.

guter Beitrag von balajimca

+6

Gott segnen deine Seele für diese Erklärung. – ahnbizcad

3

Auch wenn Sie wissen, was Sie Attribute müssen dann Mage mit :: getResourceModel mit Filtern ist ~ 5x effizienter in Geschwindigkeit und Speicher als über das Laden sagen Mage :: getModel ('Katalog/Produkt').

z.B. getResourceModel Verfahren zur Herstellung eines Produkts aus der db

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

Last ein Modell Abrufen (dies alle eav Attribute geladen werden)

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

[mehr Infos hier] [1] http://alanstorm.com/magento_advanced_orm_entity_attribute_value_part_1

Verwandte Themen