addAttributeToSelect untuk beberapa bidang tidak berfungsi

10

Saya mencoba mendapatkan riwayat pesanan pengguna, menggunakan kueri berikut dan berfungsi dengan baik. Tapi itu mengembalikan semua bidang terkait pesanan dari tabel

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

Saya hanya ingin mengambil bidang tertentu, jadi jika -> addAttributeToSelect ('*')

     used the following code 

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

Tetapi mendapatkan kesalahan sebagai "Tidak dapat menentukan nama bidang."

AnNaMaLaI
sumber

Jawaban:

20

Gunakan addFieldToSelect memetikan addAttributeToSelect

addFieldToSelect digunakan untuk model datar

addAttributeToSelect pengguna untuk model EAV

MeenakshiSundaram R
sumber
3

Alasan Anda mendapatkan kesalahan adalah bahwa metode ini Mage_Sales_Model_Resource_Collection_Abstract::addAttributeToSelecthanya berfungsi untuk atribut individual dan bukan array atribut.

Ini hanya berfungsi untuk atribut individual karena itu akan memvalidasi panggilan untuk memastikan atribut itu nyata.

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

Ketika Anda melihat ke dalam, Mage_Sales_Model_Resource_Collection_Abstract::_attributeToFieldAnda melihat bahwa itu berfungsi sebagai berikut.

  1. Jika Anda melewatkan string maka itu hanya akan mengembalikan string,
  2. Jika Anda melewatkan objek maka itu akan memvalidasi bahwa ini adalah objek bertipe Mage_Eav_Model_Entity_Attributedan mengembalikan kode atribut,

Kode tersebut terlihat sebagai berikut:

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

Jadi pilihan Anda adalah yang berikut seperti yang saya lihat:

  1. Cukup panggil addFieldToSelectdengan array kode atribut. Karena Anda hanya meneruskan kode dan bukan objek, Anda tidak akan mendapatkan validasi, tetapi mungkin Anda tidak memerlukan ini dalam kasus Anda.
  2. Panggil addAttributeToSelectsekali untuk setiap atribut.

Saya akan menyarankan dalam opsi kasus Anda satu akan menjadi yang terbaik.

David Manners
sumber
2

AFAIK menyelesaikan masalah hanya untuk mengerjakan semuanya secara terpisah (untuk alasan apa pun Anda bertekad untuk menggunakannya addAttributeToSelect:

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

Karena judul posting bukan kumpulan spesifik ... Mage_Catalog_Model_Resource_Product_Collection memiliki parameter tambahan joinType yang akan digunakan seperti:

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