addAttributeToSelect для нескольких полей не работает

10

Я пытаюсь получить историю заказов пользователей, использовал следующий запрос и работает нормально. Но он возвращает все поля, связанные с порядком из таблицы

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

Я хочу получить только определенные поля, поэтому в случае -> addAttributeToSelect ('*')

     used the following code 

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

Но появляется ошибка «Не удается определить имя поля».

Аннамалай
источник

Ответы:

20

Используйте addFieldToSelect случай добавления addAttributeToSelect

addFieldToSelect используется для плоской модели

addAttributeToSelect пользователь для модели EAV

МинакшиСундарам Р
источник
3

Причина, по которой вы получаете ошибку, состоит в том, что метод Mage_Sales_Model_Resource_Collection_Abstract::addAttributeToSelectработает только для отдельных атрибутов, а не для массива атрибутов.

Он работает только для отдельных атрибутов, потому что он проверит вызов, чтобы убедиться, что атрибут реален.

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

Когда вы смотрите в себя, Mage_Sales_Model_Resource_Collection_Abstract::_attributeToFieldвы видите, что это работает следующим образом.

  1. Если вы передадите строку, она просто вернет строку,
  2. Если вы передадите объект, он подтвердит, что это объект типа, Mage_Eav_Model_Entity_Attributeи вернет код атрибута,

Код выглядит следующим образом:

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

Таким образом, вы видите следующие варианты:

  1. Просто позвоните addFieldToSelectс массивом кодов атрибутов. Поскольку вы только передаете коды, а не объекты, вы не получите подтверждение, но, возможно, вам это не нужно в вашем случае.
  2. Вызовите addAttributeToSelectодин раз для каждого атрибута.

Я хотел бы предложить в вашем случае вариант один будет лучшим.

Дэвид Мэннерс
источник
2

AFAIK обходной путь заключается в том, чтобы сделать их все по отдельности (по любой причине, которую вы решили использовать addAttributeToSelect:

->addAttributeToSelect('created_at') 
->addAttributeToSelect('customer_id') 
->addAttributeToSelect('increment_id') 
->addAttributeToSelect('updated_at') 
->addAttributeToSelect('status') 
->addAttributeToSelect('entity_id')
->addAttributeToSelect('state')
Роберт Паундер
источник
1

Поскольку заголовок поста не является специфичным для коллекции ... Mage_Catalog_Model_Resource_Product_Collection имеет дополнительный параметр joinType, который должен использоваться следующим образом:

$attributesToSelect = array('name','description');
$collection->addAttributeToSelect($attributesToSelect, 'left');
ben.incani
источник