วิธีที่มีประสิทธิภาพมากที่สุดในการรับ ID ทั้งหมดจากคอลเล็กชัน


37

ในอดีตเพื่อรับ ID ทั้งหมดของคอลเลกชันผลิตภัณฑ์ฉันเคยใช้getAllIdsกับคอลเลกชันเสมอเชื่อว่านี่เป็นวิธีที่ป้องกันการโหลดคอลเลกชันเต็มรูปแบบด้วยข้อมูลเป็นต้น

แต่จริงๆแล้วฉันดูวิธีการในวันนี้และโหลดคอลเลกชันและวนซ้ำแต่ละไอเท็มเพื่อรับอาร์เรย์ ID

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

คำถามของฉันคืออะไรวิธีที่มีประสิทธิภาพมากที่สุดในการดึงเฉพาะฟิลด์ ID จากการรวบรวมคืออะไร?

คำตอบ:


43

ที่จริงแล้วgetAllIdsเป็นวิธีที่ดีที่สุดในการทำมัน ตัวอย่างเช่นในโมเดลรีซอร์สคอลเล็กชันผลิตภัณฑ์เมธอดจะเป็นดังนี้:

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

ดังนั้นทุกอย่างจะถูกเรียกคืนจากการเลือกเพียงครั้งเดียวและไม่จำเป็นต้องทำซ้ำ ในรูปแบบทรัพยากรนามธรรมมันมีลักษณะเช่นนี้:

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

ดังนั้นทุกอย่างที่ขยายMage_Core_Model_Resource_Db_Collection_Abstractควรใช้สิ่งนี้เว้นแต่จะระบุไว้เป็นอย่างอื่น

วิธีที่คุณดูมาจากคลาสฐานVarien_Data_Collectionแต่มันถูกเขียนทับในลูกของมัน


6

ในกรณีนี้คุณสามารถใช้วัตถุรวบรวม

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

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

addAttributeToSelectเพราะentity_idมันไม่จำเป็นจริงๆ แต่สำหรับวัตถุประสงค์ในการสาธิตที่ฉันใส่ไว้ให้เพิ่มฟิลด์ที่คุณต้องการและคุณก็ทำเสร็จแล้ว!

ข้อมูลเพิ่มเติมเกี่ยวกับคอลเล็กชันที่คุณจะพบใน Wikipage นี้


3

เพิ่มประสิทธิภาพมากขึ้น

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

นี้จะกระทำโดยเริ่มต้น ... $this->_getClearSelect()ดู
sv3n
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.