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

但是出现错误,如“无法确定字段名称”。

Answers:


20

addFieldToSelect 在addAttributeToSelect的情况下使用

用于平面模型的addFieldToSelect

EAV模型的addAttributeToSelect用户


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');
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.