addAttributeToSelect para múltiples campos que no funcionan

10

Estoy tratando de obtener el historial de pedidos del usuario, utilicé la siguiente consulta y funciona bien. Pero está devolviendo todos los campos relacionados con el orden de la tabla

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

Quiero buscar solo campos particulares, así que en caso de -> addAttributeToSelect ('*')

     used the following code 

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

Pero obteniendo un error como "No se puede determinar el nombre del campo".

AnNaMaLaI
fuente

Respuestas:

20

Usar en addFieldToSelect caso de addAttributeToSelect

addFieldToSelect usado para modelo plano

addAttributeToSelect usuario para el modelo EAV

MeenakshiSundaram R
fuente
3

La razón por la que obtiene el error es que el método Mage_Sales_Model_Resource_Collection_Abstract::addAttributeToSelectsolo funciona para atributos individuales y no para una matriz de atributos.

Solo funciona para atributos individuales porque validará la llamada para asegurarse de que el atributo sea real.

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

Cuando miras Mage_Sales_Model_Resource_Collection_Abstract::_attributeToField, ves que funciona de la siguiente manera.

  1. Si pasa una cadena, simplemente devolverá la cadena,
  2. Si pasa un objeto, validará que este es un objeto de tipo Mage_Eav_Model_Entity_Attributey devolverá el código de atributo,

El código tiene el siguiente aspecto:

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

Entonces, sus opciones son las siguientes tal como las veo:

  1. Simplemente llame addFieldToSelectcon una matriz de códigos de atributos. Como solo está pasando códigos y no objetos, no obtendrá la validación, pero tal vez no necesite esto en su caso.
  2. Llame addAttributeToSelectuna vez por cada atributo.

Sugeriría en su caso, la opción sería la mejor.

David modales
fuente
2

AFAIK una solución es solo hacerlos todos singularmente (por cualquier razón que esté decidido a usar addAttributeToSelect:

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

Como el título de la publicación no es específico de la colección ... Mage_Catalog_Model_Resource_Product_Collection tiene un parámetro adicional joinType que se utilizará así:

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