addAttributeToSelectがcore / resource_iteratorで機能しない?


8
public function run()
{
    $products = Mage::getModel('catalog/product')
            ->getCollection()
            ->addFinalPrice()
            ->addAttributeToSelect('name')

    Mage::getSingleton('core/resource_iterator')
            ->walk($products->getSelect()->limit(10), array(array($this, 'getLine')));

}

public function getLine($args)
{
    var_dump($args['row']);
}

私のgetLine()方法では私は何も得ませんnameaddFinalPrice()機能します:

array(16) {
  ["entity_id"]=>
  string(2) "61"
  ["entity_type_id"]=>
  string(1) "4"
  ["attribute_set_id"]=>
  string(2) "10"
  ["type_id"]=>
  string(6) "simple"
  ["sku"]=>
  string(15) "50-F01010001-03"
  ["has_options"]=>
  string(1) "0"
  ["required_options"]=>
  string(1) "0"
  ["created_at"]=>
  string(19) "2011-07-05 18:30:48"
  ["updated_at"]=>
  string(19) "2014-09-04 07:34:21"
  ["indexed_price"]=>
  string(7) "14.5000"
  ["price"]=>
  string(7) "14.5000"
  ["final_price"]=>
  string(7) "14.5000"
  ["minimal_price"]=>
  string(7) "14.5000"
  ["min_price"]=>
  string(7) "14.5000"
  ["max_price"]=>
  string(7) "14.5000"
  ["tier_price"]=>
  NULL
}

同じ問題imagepriceおよびその他すべての属性。

回答:


7

残念ながら、core/iteratorリソースモデルはクエリで直接機能し、コレクション固有の機能を使用しないため、EAVモデルではうまく機能しません。

これは、EAVコレクションを読み込むときに通常発生することです(少し簡略化します)。

  • エンティティテーブルから基本データを選択します(これは何ですか$collection->getSelect()ません
  • 追加のクエリを使用して値テーブルから属性を読み込み、読み込まれた各モデルにこのデータを追加します

これはすべてload()メソッドで行われます(Mage_Eav_Model_Entity_Collection_Abstract::_loadAttributes()実装の詳細を確認するかどうかを確認してください)

リソースイテレータを使用する理由は、通常、一度にすべてのデータをロードしたくないためです。この機能を適切に使用することはできません。

代わりに結合を使用して単一のクエリを作成しようとしましたが、すぐにMySQLが一度に63個の結合しか許可しないという問題が発生しました。いくつかの属性だけが必要な場合は、それでもうまくいくかもしれません。

そうでなければ、あなたの最善の策は次のようにチャンクでコレクションをロードして処理することです:

$ids = Mage::getModel('catalog/product')
    ->getCollection()
    ->getAllIds();

$page = 1;
do {
    $collection = Mage::getModel('catalog/product')
        ->getCollection()
        ->addIdFilter($ids)
        ->setPageSize(100)
        ->setPage($page);
    $results = $collection->load();
    // do stuff ...
    $page++;
} while ($results->count());

メモリ制限の問題のためにイテレータを使用しましたが、ここではイテレータを使用するとさらに多くのメモリを使用することがわかりました。通常のコレクションに戻すよう修正しましたini_set('memory_limit','512M');
PiTheNumber 2015

7

次の'inner'ような2番目のパラメーターを使用する必要があります。

$products = Mage::getModel('catalog/product')
     ->getCollection()
     ->addAttributeToSelect(array('name', 'image'), 'inner');

参照:https : //stackoverflow.com/questions/24614533/magento-collection-iterator-cannot-get-additional-attribute


これは私が言及していたJOINソリューションです。いくつかの属性のみが必要で、それを試さない場合にaddAttributeToSelect('*')
適し

eav属性がまったく設定されていないエンティティを含める場合は、「左」を使用します。
Siliconrockstar 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.