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

Réponses:


20

Utiliser au addFieldToSelect cas où addAttributeToSelect

addFieldToSelect utilisé pour le modèle plat

Utilisateur addAttributeToSelect pour le modèle EAV


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.


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

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');
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.