addAttributeToSelect für mehrere Felder funktioniert nicht

10

Ich versuche, den Bestellverlauf des Benutzers abzurufen, habe die folgende Abfrage verwendet und sie funktioniert einwandfrei. Es werden jedoch alle auftragsbezogenen Felder aus der Tabelle zurückgegeben

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

Ich möchte nur bestimmte Felder abrufen , also im Fall von -> addAttributeToSelect ('*')

     used the following code 

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

Es wird jedoch der Fehler "Feldname kann nicht ermittelt werden" angezeigt.

AnNaMaLaI
quelle

Antworten:

20

Verwenden Sie den addFieldToSelect Fall addAttributeToSelect

addFieldToSelect wird für flache Modelle verwendet

Benutzer addAttributeToSelect für EAV-Modell

MeenakshiSundaram R.
quelle
3

Der Grund, warum Sie den Fehler erhalten, ist, dass die Methode Mage_Sales_Model_Resource_Collection_Abstract::addAttributeToSelectnur für einzelne Attribute und nicht für ein Array von Attributen funktioniert.

Es funktioniert nur für einzelne Attribute, da der Aufruf überprüft wird, um sicherzustellen, dass das Attribut echt ist.

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

Wenn Sie hineinschauen Mage_Sales_Model_Resource_Collection_Abstract::_attributeToField, sehen Sie, dass es wie folgt funktioniert.

  1. Wenn Sie eine Zeichenfolge übergeben, wird die Zeichenfolge einfach zurückgegeben.
  2. Wenn Sie ein Objekt übergeben, wird überprüft, ob es sich um ein Objekt vom Typ handelt, Mage_Eav_Model_Entity_Attributeund der Attributcode zurückgegeben.

Der Code sieht wie folgt aus:

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;
}

So wie ich es sehe, haben Sie folgende Möglichkeiten:

  1. Rufen Sie einfach addFieldToSelectmit einer Reihe von Attributcodes auf. Da Sie nur Codes und keine Objekte übergeben, erhalten Sie keine Validierung, aber möglicherweise benötigen Sie diese in Ihrem Fall nicht.
  2. Rufen Sie addAttributeToSelecteinmal für jedes Attribut auf.

Ich würde in Ihrem Fall vorschlagen, dass Option eins die beste ist.

David Manners
quelle
2

AFAIK eine Problemumgehung besteht nur darin, sie alle einzeln auszuführen (aus welchem ​​Grund auch immer Sie entschlossen sind, Folgendes zu verwenden addAttributeToSelect:

->addAttributeToSelect('created_at') 
->addAttributeToSelect('customer_id') 
->addAttributeToSelect('increment_id') 
->addAttributeToSelect('updated_at') 
->addAttributeToSelect('status') 
->addAttributeToSelect('entity_id')
->addAttributeToSelect('state')
Robert Pounder
quelle
1

Da der Titel des Beitrags nicht sammlungsspezifisch ist ... Mage_Catalog_Model_Resource_Product_Collection verfügt über einen zusätzlichen Parameter joinType, der wie folgt verwendet werden soll:

$attributesToSelect = array('name','description');
$collection->addAttributeToSelect($attributesToSelect, 'left');
ben.incani
quelle