addAttributionToSelect không hoạt động với 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']);
}

Trong getLine()phương pháp của tôi, tôi không nhận được namenhưng addFinalPrice()hoạt động:

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
}

Cùng một vấn đề với image, pricevà mọi thuộc tính khác.

Câu trả lời:


7

Thật không may, core/iteratormô hình tài nguyên không hoạt động tốt với các mô hình EAV, vì nó trực tiếp hoạt động với truy vấn và không sử dụng bất kỳ tính năng cụ thể nào của bộ sưu tập.

Đây là điều thường xảy ra khi tải bộ sưu tập EAV (Tôi sẽ đơn giản hóa một chút):

  • chọn dữ liệu cơ bản từ bảng thực thể (đây là những gì $collection->getSelect()không
  • tải các thuộc tính từ các bảng giá trị với một truy vấn bổ sung và thêm dữ liệu này vào từng mô hình được tải

Tất cả điều này xảy ra trong load()phương thức (xem Mage_Eav_Model_Entity_Collection_Abstract::_loadAttributes()bạn có muốn xem chi tiết triển khai không)

Vì lý do sử dụng trình lặp tài nguyên thường là bạn không muốn tải tất cả dữ liệu cùng một lúc, nên bạn không thể sử dụng tính năng này một cách hợp lý.

Tôi đã cố gắng xây dựng một truy vấn duy nhất với các phép nối thay thế, nhưng sớm gặp phải vấn đề là MySQL "chỉ" cho phép 63 tham gia cùng một lúc. Nếu bạn chỉ cần một vài thuộc tính, nó có thể làm việc cho bạn.

Nếu không, cách tốt nhất của bạn là tải và xử lý bộ sưu tập theo từng khối như thế này:

$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());

Tôi đã sử dụng iterator vì vấn đề giới hạn bộ nhớ nhưng hóa ra sử dụng iterator ở đây lại sử dụng nhiều bộ nhớ hơn. Tôi đã sửa nó trở lại bộ sưu tập bình thường và ini_set('memory_limit','512M');.
PiTheNumber 16/07/2015

7

Bạn phải sử dụng tham số thứ hai 'inner'như thế này:

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

Xem: /programming/24614533/magento-collection-iterator-cannot-get-additable-attribution


Đây là giải pháp THAM GIA mà tôi đã đề cập đến. Tốt nếu bạn chỉ cần một vài thuộc tính, nhưng đừng thử vớiaddAttributeToSelect('*')
Fabian Schmengler 16/07/2015

Sử dụng 'trái' nếu bạn muốn bao gồm các thực thể trong đó thuộc tính eav hoàn toàn không được đặt.
siliconrockstar 20/03/18
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.