Cara paling efisien untuk mendapatkan semua ID dari koleksi

37

Di masa lalu untuk mendapatkan semua ID dari koleksi produk, saya selalu menggunakan getAllIdspada koleksi, percaya ini adalah metode yang mencegah beban pengumpulan penuh dengan data dll.

Tapi, saya benar-benar melihat metode hari ini dan memuat koleksi dan beralih ke setiap item untuk mendapatkan ID array.

public function getAllIds()
{
    $ids = array();
    foreach ($this->getItems() as $item) {
        $ids[] = $this->_getItemId($item);
    }
    return $ids;
}

Pertanyaan saya adalah, apa metode paling efisien untuk mengambil hanya bidang ID dari koleksi?

Marty Wallace
sumber

Jawaban:

43

Sebenarnya getAllIdsadalah cara terbaik untuk melakukannya. Misalnya dalam model sumber daya pengumpulan produk, metodenya terlihat seperti ini:

public function getAllIds($limit = null, $offset = null)
{
    $idsSelect = $this->_getClearSelect();
    $idsSelect->columns('e.' . $this->getEntity()->getIdFieldName());
    $idsSelect->limit($limit, $offset);
    $idsSelect->resetJoinLeft();

    return $this->getConnection()->fetchCol($idsSelect, $this->_bindParams);
}

Jadi semuanya diambil dari satu pilih dan tidak diperlukan iterasi. Juga dalam model sumber daya abstrak terlihat seperti ini:

public function getAllIds()
{
    $idsSelect = clone $this->getSelect();
    $idsSelect->reset(Zend_Db_Select::ORDER);
    $idsSelect->reset(Zend_Db_Select::LIMIT_COUNT);
    $idsSelect->reset(Zend_Db_Select::LIMIT_OFFSET);
    $idsSelect->reset(Zend_Db_Select::COLUMNS);

    $idsSelect->columns($this->getResource()->getIdFieldName(), 'main_table');
    return $this->getConnection()->fetchCol($idsSelect);
}

Jadi segala sesuatu yang meluas Mage_Core_Model_Resource_Db_Collection_Abstractharus menggunakan ini kecuali ditentukan lain.

Metode yang Anda lihat berasal dari kelas dasar Varien_Data_Collectiontetapi ditimpa pada anak-anaknya.

Marius
sumber
6

Dalam hal ini Anda dapat menggunakan objek koleksi

$collection = Mage::getModel('catalog/product')->getCollection()
   ->addAttributeToSelect('entity_id');

[...] 
do your loop
[...]

addAttributeToSelect untuk entity_id tidak benar-benar diperlukan tetapi untuk menunjukkan tujuan saya memasukkannya, tambahkan bidang yang Anda butuhkan dan Anda selesai!

Lebih banyak tentang koleksi yang akan Anda temukan di Wikipage ini

Sander Mangel
sumber
3

Lebih Dioptimalkan

$collection = Mage::getModel('catalog/product')->getCollection();
$collection->getSelect()->reset(Zend_Db_Select::COLUMNS);
$collection->getSelect()->columns('entity_id');
$collection1Ids[] = $collection->getAllIds();
Hassan Ali Shahzad
sumber
Ini juga dilakukan secara default ... lihat $this->_getClearSelect().
sv3n