addAttributeToSelect tidak bekerja dengan 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']);
}

Dalam getLine()metode saya, saya tidak mendapat apa-apa nameselain addFinalPrice()bekerja:

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
}

Masalah yang sama dengan image, pricedan setiap atribut lainnya.

PiNomor
sumber

Jawaban:

7

Sayangnya core/iteratormodel sumber daya tidak bekerja dengan baik dengan model EAV, karena langsung bekerja dengan permintaan dan tidak menggunakan salah satu fitur koleksi tertentu.

Inilah yang biasanya terjadi ketika memuat koleksi EAV (saya akan menyederhanakan sedikit):

  • pilih data dasar dari tabel entitas (inilah yang $collection->getSelect()dilakukannya
  • memuat atribut dari tabel nilai dengan kueri tambahan dan menambahkan data ini ke setiap model yang dimuat

Ini semua terjadi dalam load()metode (lihat Mage_Eav_Model_Entity_Collection_Abstract::_loadAttributes()apakah Anda ingin melihat detail implementasi)

Karena alasan untuk menggunakan iterator sumber daya biasanya karena Anda tidak ingin memuat semua data sekaligus, Anda tidak dapat menggunakan fitur ini dengan cara yang masuk akal.

Saya mencoba untuk membangun satu permintaan dengan bergabung saja, tetapi segera mengalami masalah bahwa MySQL "hanya" memungkinkan 63 bergabung pada suatu waktu. Jika Anda hanya membutuhkan beberapa atribut, itu mungkin bekerja untuk Anda.

Kalau tidak, taruhan terbaik Anda adalah memuat dan memproses koleksi dalam potongan seperti ini:

$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());
Fabian Schmengler
sumber
Saya menggunakan iterator karena masalah batas memori tetapi ternyata menggunakan iterator di sini bahkan menggunakan lebih banyak memori. Saya memperbaikinya akan kembali ke koleksi normal dan ini_set('memory_limit','512M');.
PiTheNumber
7

Anda harus menggunakan parameter kedua 'inner'seperti ini:

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

Lihat: /programming/24614533/magento-collection-iterator-cannot-get-additional-attribute

PiNomor
sumber
Ini adalah solusi GABUNG yang saya maksudkan. Bagus jika Anda hanya memerlukan beberapa atribut, tetapi jangan mencobanya denganaddAttributeToSelect('*')
Fabian Schmengler
Gunakan 'kiri' jika Anda ingin menyertakan entitas di mana atribut eav tidak disetel sama sekali.
siliconrockstar