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以及其他所有属性。

Answers:


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

7

您必须'inner'像这样使用第二个参数:

$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('*')
Fabian Schmengler,2015年

如果要包括根本未设置eav属性的实体,请使用“左”。
Siliconrockstar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.