コレクションモデルとリソースモデルについて


29

リソースモデルとコレクションモデルの使用について少し混乱しています。特定の属性を使用して製品をロードする例を見ると、コレクションモデルを使用する場合もあれば、リソースモデルを使用する場合もあります。

また、特定の方法get...set...テーブル行名をいつ使用できますか?のようgetNamegetId。私は使用しようとしましたが、値を取得できず、「オブジェクトの未定義のメソッドを呼び出しています」というエラーが表示されます

$product = Mage::getModel('catalog/product')
    ->loadByAttribute('name', 'product_name');

echo $product->getName(); 
echo $product->getSku();

「未定義のメソッドgetSku()」を示しています

を使用するとvar_dump($product)、オブジェクトにSKUが表示されますが、SKUを取得できませんgetSku()...


明確にするために- $productあなたの例では、Mage_Catalog_Model_ProductMagentoの用語では「モデル」であるのインスタンスです。
ベンマーク

はい、そうです。しかし、コレクションモデルとリソースモデルをいつ使用するか、どのメソッドを使用できるかがわかりません。私はコレクションのモデルは、モジュールおよびリソースのモデル>>コレクションフォルダ内に用意されていわかるように、私はそれについて混乱ビットので、リソースモデルが、使用するとモデルが必要でavailbleである
MagentoBoy

コレクションやアウトソースでも利用可能な利用可能なメソッドを使用する必要があることは知っています。しかし、正しいモデルを使用するのを見つけるのは困難です。また、「Get」メソッドを使用して結果セットから結果を取得することもできません。これは、データベーステーブルの行名を使用するgetName()を意味します。オブジェクト内の未定義のメソッドは、使用する必要がある間違ったモデルまたはメソッドにアクセスしていることを示しているため、使用する必要があるかどうかはわかりません。
MagentoBoy

1
この質問をしてくれてありがとう..私はこの質問の答えを長い間探していました.. + 1 ..

回答:


63

MagentoのCRUDモデルには3つの基本的なクラスタイプがあります。

「モデル」は、最も一般的に使用するものです。これは、データベースにとらわれない方法で特定のタイプのデータを表します(製品、カテゴリ、CMSページ、レビューなど)

「リソースモデル」とは、Magentoから実際にデータを取得するクラスのことです。毎モデルには、データベースからモデルの単一インスタンスをロードするために使用されるリソースモデルがあります。

「コレクション」は、一連のルールに基づいて複数のモデルの構造のような配列をロードするクラスです。SQLのように考えてくださいWHERE clause

ややこしいことに、舞台裏では、Magento コレクションは、リソースモデルであると考えています。そのため、コレクションリソースモデル個々のリソースモデルがあります。

一般的に、特定のアイテムをロードする場合は、モデルを使用します。多数のアイテムをロードする場合は、コレクションリソースモデルを使用します。

//loads one
$product = Mage::getModel('catalog/product')->load($id);

//loads many products where price is greater than 100
$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*') //load all fields, see EAV below
->addAttributeToFilter('price', array('gt'=>'100'));

foreach($products as $product)
{
    var_dump($product->getSku());
}

を介してロードする際に留意すべきこと コレクションリソースモデルは、個々のモデルの afterLoadメソッドが自動的に呼び出されないことです。つまり、一部のデータがロードされない可能性があります。

individuaリソースモデルクラスは、通常、直接アクセスされていません。ただし、特定のモデルに有用なメソッドを備えたリソースモデルがある場合があります。これらは、システムを使用して時間をかけて発見します。

最後に、もう1つ区別する必要があります。Magentoの通常のCRUDモデルには、数値IDではないものを介して読み込むための特別な構文があります。たとえば、CMSページモデルをタイトルで読み込む方法は次のとおりです。

$page = Mage::getModel('cms/page')->load('Home page','title');
var_dump($page->getData());

ただし、いくつかのMagentoモデルはEAVモデルです。これは「エンティティー属性値」の略で、これらのモデルには固定されたフィールドのセットがないことを示す素晴らしい方法です。これには、製品モデルとカテゴリモデルが含まれます。この機能により、製品の種類ごとに異なる属性を選択できます。EAVモデルの各フィールドは、属性と呼ばれます。上記の構文はこれらのモデルでは機能しません。代わりに、loadByAttributeメソッド。

$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'n2610');

特定の問題に関して、特定のテキスト「method undefined」でエラーが発生している場合、システムに何らかの問題があります。getSkuメソッドが存在しない場合でも、Magentoにはマジックセッターおよびゲッターメソッドがあり、getモデルの呼び出しがnullであっても常に何かを返すようにします。

より可能性が高いのは、次のようなエラーが発生していることです

Call to a member function getSku() on a non-object

loadByAttributeメソッドが返すため、このエラーが発生していますfalseオブジェクトをロードできない場合にています。

$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'this-is-not-a-sku');
var_dump($product); //prints false

コードで次のようなものを試してください。

$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'sku-value');
if($product)
{
    var_dump($product->getName());
    var_dump($product->getSku());
    var_dump($product->getData());
}
else
{
    var_dump("Could not load product");
}

条件に加えて、getData()メソッドに注意してください。これにより、すべてのオブジェクトのデータの配列が配列として返されます。

うまく行けばこれで十分だと思います。がんばろう!


@Alan ..非常に素晴らしい説明... Magentoでのあなたの投稿の多くを読みました。あなたの情報を先に進めます。問題が発生した場合は、このコミュニティから良いサポートが得られることを願っています。magentoとpogrammingが初めてなので、私の質問はそれほど概念的ではないかもしれませんが、それでも学びたいです。私は本当にmagentoフレームワークが好きです:) ..ありがとうございます:)
MagentoBoy

すみません、もう1つ質問があります。$ product = Mage :: getModel( 'catalog / product');を呼び出すと そしてgetName()とgetSku()を呼び出すと。foreachloopで$ productを反復処理すると値を取得できますか?または私はloadByAttribute()メソッドを呼び出す必要がありますか?
MagentoBoy

@MagentoBoy申し訳ありませんが、言葉の壁があなたの質問を隠しているようです。あなたが何を求めているのか分かりません。
アランストーム

ごめんなさい 興奮して、私は質問を明確に表現しませんでした。しかし、試してみたところ、製品のリストを取得できるようになり、異なる属性を適切に使用して製品を取得できるようになりました。:)はい、私の質問は、addAttributeToSelect( '*')、addAttributeToFilter()またはloadByAttribute()を呼び出さずに、getName()、getPrice()、getSku()などのgetメソッドを使用できますか?例えば $ product = Mage :: getModel( 'catalog / product'); foreach($ product as $ p){echo $ p-> getName()。 ""。$ p-> getSku();} ... getモデルは製品クラスをインスタンス化するので、アクセスgetおよびsetメソッドにアクセスできます。
MagentoBoy

1
@ user8009このエラーメッセージは、さまざまな理由で発生する可能性があります。FTPアクセスを取得できない場合、またはシステムのローカル/開発バージョンで問題を再現できない場合は、問題を解決できません。
アランストーム14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.