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?

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.


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


3

Lebih Dioptimalkan

$collection = Mage::getModel('catalog/product')->getCollection();
$collection->getSelect()->reset(Zend_Db_Select::COLUMNS);
$collection->getSelect()->columns('entity_id');
$collection1Ids[] = $collection->getAllIds();

Ini juga dilakukan secara default ... lihat $this->_getClearSelect().
sv3n
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.