addAttributeToSelect pour plusieurs champs ne fonctionne pas

10

J'essaie d'obtenir l'historique des commandes des utilisateurs, j'ai utilisé la requête suivante et son bon fonctionnement. Mais il renvoie tous les champs liés à la commande de la table

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

Je veux récupérer uniquement des champs particuliers, donc en cas de -> addAttributeToSelect ('*')

     used the following code 

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

Mais obtenir une erreur comme "Impossible de déterminer le nom du champ."

AnNaMaLaI
la source

Réponses:

20

Utiliser au addFieldToSelect cas où addAttributeToSelect

addFieldToSelect utilisé pour le modèle plat

Utilisateur addAttributeToSelect pour le modèle EAV

MeenakshiSundaram R
la source
3

La raison pour laquelle vous obtenez l'erreur est que la méthode Mage_Sales_Model_Resource_Collection_Abstract::addAttributeToSelectne fonctionne que pour les attributs individuels et non pour un tableau d'attributs.

Il ne fonctionne que pour les attributs individuels, car il validera l'appel pour s'assurer que l'attribut est réel.

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

Lorsque vous regardez, Mage_Sales_Model_Resource_Collection_Abstract::_attributeToFieldvous voyez que cela fonctionne comme suit.

  1. Si vous passez une chaîne, elle retournera simplement la chaîne,
  2. Si vous passez un objet, il validera qu'il s'agit d'un objet de type Mage_Eav_Model_Entity_Attributeet renverra le code d'attribut,

Le code se présente comme suit:

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

Donc, vos options sont les suivantes comme je le vois:

  1. Appelez simplement addFieldToSelectavec un tableau de codes d'attribut. Puisque vous ne passez que des codes et non des objets, vous n'obtiendrez pas la validation, mais peut-être que vous n'en avez pas besoin dans votre cas.
  2. Appelez addAttributeToSelectune fois pour chaque attribut.

Je dirais que dans votre cas, l'option serait la meilleure.

David Manners
la source
2

AFAIK une solution de contournement consiste simplement à les faire tous individuellement (pour une raison que vous êtes déterminé à utiliser addAttributeToSelect:

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

Comme le titre de l'article n'est pas spécifique à une collection ... Mage_Catalog_Model_Resource_Product_Collection a un paramètre joinType supplémentaire qui doit être utilisé comme suit:

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