addAttributeToSelect para vários campos que não estão funcionando

10

Estou tentando obter o histórico de pedidos do usuário, usei a consulta a seguir e está funcionando bem. Mas está retornando todos os campos relacionados ao pedido da tabela

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

Quero buscar apenas campos específicos, portanto, no caso de -> addAttributeToSelect ('*')

     used the following code 

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

Mas obter erro como "Não é possível determinar o nome do campo".

AnNaMaLaI
fonte

Respostas:

20

Use a addFieldToSelect caixa de addAttributeToSelect

addFieldToSelect usado para modelo plano

Usuário addAttributeToSelect para o modelo EAV

MeenakshiSundaram R
fonte
3

O motivo pelo qual você está recebendo o erro é que o método Mage_Sales_Model_Resource_Collection_Abstract::addAttributeToSelectfunciona apenas para atributos individuais e não para uma matriz de atributos.

Ele funciona apenas para atributos individuais porque validará a chamada para garantir que o atributo seja real.

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

Quando você olha para dentro, Mage_Sales_Model_Resource_Collection_Abstract::_attributeToFieldvê que funciona da seguinte maneira.

  1. Se você passar uma string, ela simplesmente retornará a string,
  2. Se você passar um objeto, ele validará que esse é um objeto do tipo Mage_Eav_Model_Entity_Attributee retornará o código do atributo,

O código é o seguinte:

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

Então você opções são as seguintes, a meu ver:

  1. Basta ligar addFieldToSelectcom uma variedade de códigos de atributo. Como você está apenas passando códigos e não objetos, não receberá a validação, mas talvez você não precise disso no seu caso.
  2. Ligue addAttributeToSelectuma vez para cada atributo.

Eu sugeriria no seu caso a opção um seria a melhor.

David Manners
fonte
2

Uma solução alternativa para o AFAIK é apenas fazê-las individualmente (por qualquer motivo que você esteja determinado a usar addAttributeToSelect:

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

Como o título da postagem não é específico da coleção ... Mage_Catalog_Model_Resource_Product_Collection possui um parâmetro adicional joinType que deve ser usado assim:

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