addAttributeToSelect non funziona 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']);
}

Nel mio getLine()metodo ottengo no namema addFinalPrice()funziona:

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
}

Lo stesso problema con image, priceed ogni altro attributo.

Risposte:


7

Sfortunatamente il core/iteratormodello di risorsa non funziona bene con i modelli EAV, perché funziona direttamente con la query e non utilizza nessuna delle funzionalità specifiche della raccolta.

Questo è ciò che accade di solito quando si carica una raccolta EAV (semplificherò un po '):

  • seleziona i dati di base dalla tabella delle entità (questo è ciò che $collection->getSelect()fa
  • caricare gli attributi dalle tabelle dei valori con una query aggiuntiva e aggiungere questi dati a ciascun modello caricato

Tutto questo accade nel load()metodo (vedi Mage_Eav_Model_Entity_Collection_Abstract::_loadAttributes()se vuoi vedere i dettagli di implementazione)

Poiché il motivo per utilizzare l'iteratore di risorse è di solito che non si desidera caricare tutti i dati contemporaneamente, non è possibile utilizzare questa funzione in modo ragionevole.

Ho provato invece a creare una singola query con join, ma presto ho riscontrato il problema che MySQL "solo" consente 63 join alla volta. Se hai solo bisogno di alcuni attributi, potrebbe funzionare per te.

In caso contrario, la soluzione migliore è caricare ed elaborare la raccolta in blocchi come questo:

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

Ho usato l'iteratore a causa di un problema di limite di memoria ma si è scoperto che usando l'iteratore qui uso ancora più memoria. Ho risolto il problema tornando alla raccolta normale e ini_set('memory_limit','512M');.
PiTheNumber

7

Devi usare il secondo parametro in 'inner'questo modo:

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

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


Questa è la soluzione JOIN a cui mi riferivo. Buono se hai solo bisogno di alcuni attributi, ma non provarlo conaddAttributeToSelect('*')
Fabian Schmengler,

Utilizzare 'left' se si desidera includere entità in cui l'attributo eav non è impostato affatto.
siliconrockstar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.