1

古い開発者が担当していたMagentoプロジェクトを継承しました。Magentoの経験は非常に限られているので、製品コレクションとcatalog/productモデルがどのように機能しているかを理解したいと思います。

具体的には、コレクションと製品オブジェクトがなぜそれほど巨大なのか疑問に思っていますか?

私はこのようなコードを持っています:

<?php $_productCollection = $this->getLoadedProductCollection(); ?>
<?php foreach ($_productCollection as $_product): ?>
    <?php $_product = Mage::getModel( 'catalog/product' )->load( $_product->getId() ); ?>
    <?php print $this->getLayout()->createBlock('mymodule_name/category_products_item')->setProduct($_product)->toHtml() ?>
<?php endforeach ?>

大量のデータを取得する場合、print_r($_productCollection)または取得する場合、本当に必要なのはいくつかの製品属性(ID、名前、価格、画像のURLなど)だけです。print_r($_product)

私はカスタムリレーショナルデータベースプラットフォームに慣れており、製品を使用する必要がある場合は、次のような非常に単純なことを実行しますSELECT id,name,price FROM products;。Magentoでこれをどのように達成するかはまったくわかりません。カスタムモデルなどを作成しますか?

だから誰でも教えてください:

1)上記のオブジェクトはなぜそれほど巨大なのですか?

2)(上記のように)いくつかの製品属性のみが必要な場合、オブジェクトをそれらの属性のみに制限してサイズを縮小する方法はありますか?

3)このようにオブジェクトを使用することで、パフォーマンスやメモリに影響がありますか?

どうもありがとう!

4

2 に答える 2

0

Magentoからデータにアクセスする方法はいくつかあります。

  • load()=>を使用して、モデルに関連するすべてのデータ(属性)をロードします。それは非常に遅く、パフォーマンスを低下させます。商品の場合、商品ページでのみload()を使用する必要があります(そのページで使用するすべてのデータは単一のオブジェクトに関連しているため、完全に読み込むことができます)

  • コレクションの使用=>オブジェクトのリストを取得する必要がある場合は、(少なくとも)コレクションを使用する必要があります。取得する属性リストを決定するのはあなた次第です。選択/フィルタリングに属性を追加すると、コレクションはバックグラウンドでEAVテーブルなどへのSQL結合を実行できます。

  • カスタムSQLの使用=>複雑なオブジェクトを処理する場合、コレクションは遅くなる可能性があります(コレクションは、必要のないテーブルへの多くのSQL結合を初期化します)... BDDからデータにアクセスする最後の方法は、ResourceModelに独自のSQLを作成することです。

表示するスクリプトには、大きなエラーがあります。コレクションを反復処理するforeach内に完全なモデルをロードします。製品をload()する必要がある場合は、コレクションに属性が見つからなかったためだと思いますか?その場合、属性を取得するためにコレクションを変更するだけで済みます...

たとえば、製品の場合、magentoは、インスタンス化する製品->コレクションに属性を自動的に追加(または削除)する方法を提供します。(Mage_Catalogのconfig.xmlのfrontend / product / collection / attributes XMLタグを参照してください)

于 2012-10-17T15:37:25.587 に答える
-1

これは、magentoがキャッシュ再帰OMGシステムを使用し、リレーショナルデータベース開発者を夢中にさせるためです。私もその一人です。しかし、私の理解では、Mage :: getModel('model')-> getCollection()を使用する方が良いと思います。次に、Magentoストアが開始すると、bigggggggキャッシュスキーマを作成して情報をより速く提供するため、phpを使用したSQL検索の王様がいます。それは一種のインデックスリングです。

したがって、いくつかのフィールドが必要な場合は、.....-> getCollection()-> addAttributeToSelect('name')を使用できます。例:

あなたのMagentoの理解にGl。

于 2012-10-17T14:56:07.703 に答える