2014-01-16 7 views
22

Magentoを使い始めたばかりです。特に、モデルとORMの仕組みに着目しました。Magento-Mage :: getResourceModelとMage :: getModelをいつ使用するのですか

私は誰にも違いがそれらのそれぞれの間にあるものを私に伝えることができ、これらの三つの方法

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

を使用していますか?

getSingleton()はメモリを共有し、getModel()は読み込まれる同じテーブルの新しいオブジェクトに新しいメモリを使用することがわかりました。

私は上記のすべての方法を使用していますが、それらを区別することはできませんでした。

答えて

37

getsingletonとgetmodelの例と完全に相違しています。

メイジ:: getSingleton()

メイジ:: getSingleton()は、同じクラスのインスタンスがメモリに存在するかどうまずチェックします。インスタンスが存在する場合、メモリから同じオブジェクトを返します。したがって、Mage :: getSingleton()はMage :: getModel()より高速です。

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

$の製品1と$ product2は、OSの同じメモリを共有し、唯一のインスタンスごとに戻ります両方。

メイジ:: getModel()

メイジ:: getModel()オブジェクトの新しいインスタンスにも、このようなオブジェクトは、構成内に存在するたびに作成されます。

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

$の製品1と$ product2は両方とも同じオブジェクトの異なる瞬間を有し、また

メイジ異なるメモリを占有:: getResourceModel()私の知る限りでは

Magentoのすべてのコレクションはリソース・モデルです。彼らは、それはあなたが使用して機能している本当に問題ではない

Mage::getResourceModel() 

または

Mage::getModel()->getCollection() 

によってインスタンス化されます。後者は単に最初のものを呼び出します。 Magentoチームは単にコレクションにリソースの一部を加えることを選択しました。おそらく、コレクションはデータベースに多くのクエリを実行する必要があるからです。通常、コレクション以外にはMage::getResourceModel()に電話する必要はありません。また

balajimca

+6

神が祝福し、製品を取り出すの getResourceModel方法この説明のためにあなたの魂。 – ahnbizcad

3

によって良いポストにあなたはメイジを使用して、次に必要な属性が何::フィルターとgetResourceModelは言う魔道士を経由してロードするよりも、速度とメモリの両方で〜5倍、より効率的である知っていれば:: getModel( 'カタログ/製品')。

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

関連する問題