addAttributeToSelect per più campi non funzionanti


10

Sto cercando di ottenere la cronologia degli ordini degli utenti, ho utilizzato la seguente query e il suo funzionamento è corretto. Ma sta restituendo tutti i campi relativi all'ordine dalla tabella

    $collection     = Mage::getModel("sales/order")->getCollection()
                               ->addAttributeToSelect('*')
                               ->addFieldToFilter('customer_id', 400)
                               ->setOrder('created_at', 'desc');

Voglio recuperare solo campi particolari, quindi in caso di -> addAttributeToSelect ('*')

     used the following code 

 ->addAttributeToSelect(array('created_at','customer_id','increment_id','updated_at','status','entity_id','state'))

Ma viene visualizzato l'errore "Impossibile determinare il nome del campo".

Risposte:


20

Utilizzare in addFieldToSelect caso di addAttributeToSelect

addFieldToSelect utilizzato per il modello flat

addAttributeToSelect utente per modello EAV


3

Il motivo per cui viene visualizzato l'errore è che il metodo Mage_Sales_Model_Resource_Collection_Abstract::addAttributeToSelectfunziona solo per singoli attributi e non per una matrice di attributi.

Funziona solo per i singoli attributi perché convaliderà la chiamata per assicurarsi che l'attributo sia reale.

public function addAttributeToSelect($attribute)
{
    $this->addFieldToSelect($this->_attributeToField($attribute));
    return $this;
}

Quando guardi dentro Mage_Sales_Model_Resource_Collection_Abstract::_attributeToField, vedi che funziona come segue.

  1. Se passi una stringa, la restituirà semplicemente,
  2. Se passi un oggetto, convaliderà che si tratta di un oggetto di tipo Mage_Eav_Model_Entity_Attributee restituirà il codice dell'attributo,

Il codice ha il seguente aspetto:

protected function _attributeToField($attribute)
{
    $field = false;
    if (is_string($attribute)) {
        $field = $attribute;
    } elseif ($attribute instanceof Mage_Eav_Model_Entity_Attribute) {
        $field = $attribute->getAttributeCode();
    }
    if (!$field) {
        Mage::throwException(Mage::helper('sales')->__('Cannot determine the field name.'));
    }
    return $field;
}

Quindi le opzioni sono le seguenti come la vedo io:

  1. Chiama semplicemente addFieldToSelectcon una matrice di codici di attributo. Dal momento che stai solo passando codici e non oggetti non otterrai la convalida, ma forse non ti serve nel tuo caso.
  2. Chiama addAttributeToSelectuna volta per ogni attributo.

Vorrei suggerire nel tuo caso l'opzione sarebbe la migliore.


2

AFAIK è un modo per aggirare il problema solo per eseguirle tutte singolarmente (per qualsiasi motivo si decida di utilizzare addAttributeToSelect:

->addAttributeToSelect('created_at') 
->addAttributeToSelect('customer_id') 
->addAttributeToSelect('increment_id') 
->addAttributeToSelect('updated_at') 
->addAttributeToSelect('status') 
->addAttributeToSelect('entity_id')
->addAttributeToSelect('state')

1

Poiché il titolo del post non è specifico per la raccolta ... Mage_Catalog_Model_Resource_Product_Collection ha un parametro aggiuntivo joinType che deve essere utilizzato in questo modo:

$attributesToSelect = array('name','description');
$collection->addAttributeToSelect($attributesToSelect, 'left');
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.