addAttributeToSelect no funciona con 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']);
}

En mi getLine()método obtengo no namepero addFinalPrice()funciona:

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
}

Mismo problema con image, pricey todos los demás atributos.

Respuestas:


7

Lamentablemente, el core/iteratormodelo de recursos no funciona bien con los modelos EAV, porque funciona directamente con la consulta y no utiliza ninguna de las características específicas de la colección.

Esto es lo que generalmente sucede al cargar una colección EAV (simplificaré un poco):

  • seleccionar datos básicos de la tabla de entidades (esto es lo que $collection->getSelect()hace
  • cargar los atributos de las tablas de valores con una consulta adicional y agregar estos datos a cada modelo cargado

Todo esto sucede en el load()método (vea Mage_Eav_Model_Entity_Collection_Abstract::_loadAttributes()si desea ver los detalles de implementación)

Dado que la razón para usar el iterador de recursos suele ser que no desea cargar todos los datos a la vez, no puede usar esta función de manera razonable.

Intenté construir una única consulta con combinaciones, pero pronto me encontré con el problema de que MySQL "solo" permite 63 combinaciones a la vez. Sin embargo, si solo necesita algunos atributos, podría funcionar para usted.

De lo contrario, su mejor opción es cargar y procesar la colección en fragmentos como este:

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

Usé el iterador debido a un problema de límite de memoria, pero resultó que usar el iterador aquí usa aún más memoria. Lo arreglé volviendo a la colección normal y ini_set('memory_limit','512M');.
PiTheNumber

7

Tienes que usar el segundo parámetro de 'inner'esta manera:

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

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


Esta es la solución JOIN a la que me refería. Buena si sólo necesita unos pocos atributos, pero no lo intentas conaddAttributeToSelect('*')
Fabian Schmengler

Use 'left' si desea incluir entidades donde el atributo eav no está configurado en absoluto.
siliconrockstar
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.