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.

Antworten:


20

Verwenden Sie den addFieldToSelect Fall addAttributeToSelect

addFieldToSelect wird für flache Modelle verwendet

Benutzer addAttributeToSelect für EAV-Modell


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.


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')

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');
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.