addAttributeToSelect dla wielu pól nie działa

10

Próbuję uzyskać historię zamówień użytkownika, użyłem następującego zapytania i działa dobrze. Ale zwraca wszystkie pola związane z kolejnością z tabeli

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

Chcę pobrać tylko określone pola, więc w przypadku -> addAttributeToSelect ('*')

     used the following code 

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

Ale pojawia się błąd jako „Nie można określić nazwy pola”.

AnNaMaLaI
źródło

Odpowiedzi:

20

Użyj addFieldToSelect incase z addAttributeToSelect

addFieldToSelect służy do modelu płaskiego

addAttributeToSelect użytkownik dla modelu EAV

MeenakshiSundaram R.
źródło
3

Przyczyną tego błędu jest to, że metoda Mage_Sales_Model_Resource_Collection_Abstract::addAttributeToSelectdziała tylko dla poszczególnych atrybutów, a nie dla tablicy atrybutów.

Działa tylko w przypadku pojedynczych atrybutów, ponieważ sprawdzi połączenie, aby upewnić się, że atrybut jest prawdziwy.

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

Kiedy spojrzysz na Mage_Sales_Model_Resource_Collection_Abstract::_attributeToFieldsiebie, zobaczysz, że działa to w następujący sposób.

  1. Jeśli przekażesz ciąg, zwróci on po prostu ciąg,
  2. Jeśli zdasz obiekt, sprawdzi on, czy jest to obiekt typu Mage_Eav_Model_Entity_Attributei zwróci kod atrybutu,

Kod wygląda następująco:

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

Tak więc opcje, które widzę, są następujące:

  1. Wystarczy zadzwonić addFieldToSelectza pomocą tablicy kodów atrybutów. Ponieważ przekazujesz tylko kody, a nie obiekty, nie dostaniesz walidacji, ale być może nie potrzebujesz tego w twoim przypadku.
  2. Zadzwoń addAttributeToSelectraz dla każdego atrybutu.

Sugerowałbym w twoim przypadku opcję, która byłaby najlepsza.

David Manners
źródło
2

AFAIK obejście polega na zrobieniu ich wszystkich pojedynczo (z dowolnego powodu, którego zdecydujesz się użyć addAttributeToSelect:

->addAttributeToSelect('created_at') 
->addAttributeToSelect('customer_id') 
->addAttributeToSelect('increment_id') 
->addAttributeToSelect('updated_at') 
->addAttributeToSelect('status') 
->addAttributeToSelect('entity_id')
->addAttributeToSelect('state')
Robert Pounder
źródło
1

Ponieważ tytuł postu nie jest specyficzny dla kolekcji ... Mage_Catalog_Model_Resource_Product_Collection ma dodatkowy parametr joinType, którego należy użyć w następujący sposób:

$attributesToSelect = array('name','description');
$collection->addAttributeToSelect($attributesToSelect, 'left');
ben.incani
źródło