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".

Respuestas:


20

Usar en addFieldToSelect caso de addAttributeToSelect

addFieldToSelect usado para modelo plano

addAttributeToSelect usuario para el modelo EAV


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.


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

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');
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.