Die effizienteste Methode, um alle IDs aus einer Sammlung abzurufen


37

In der Vergangenheit habe ich getAllIdsfür die Sammlung immer alle IDs einer Produktsammlung verwendet, da ich der Ansicht war, dass dies eine Methode war, die das vollständige Laden der Sammlung mit Daten usw. verhinderte.

Aber ich habe mir die Methode heute angesehen und sie lädt die Sammlung und durchläuft jedes Element, um das ID-Array zu erhalten.

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

Meine Frage ist, was ist die effizienteste Methode, um nur das ID-Feld aus einer Sammlung abzurufen?

Antworten:


43

Eigentlich getAllIdsist der beste Weg, es zu tun. Im Ressourcenmodell der Produktkollektion sieht die Methode beispielsweise folgendermaßen aus:

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

So wird alles aus einer einzigen Auswahl abgerufen und es ist keine Iteration erforderlich. Auch im abstrakten Ressourcenmodell sieht es so aus:

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

Alles, was erweitert wird, Mage_Core_Model_Resource_Db_Collection_Abstractsollte dies verwenden, sofern nicht anders angegeben.

Die von Ihnen betrachtete Methode stammt aus der Basisklasse, wird Varien_Data_Collectionjedoch in ihren untergeordneten Klassen überschrieben.


6

In diesem Fall können Sie das Erfassungsobjekt verwenden

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

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

addAttributeToSelectFür entity_idist nicht wirklich erforderlich, aber zu Demonstrationszwecken habe ich es eingegeben, die Felder hinzugefügt, die Sie benötigen, und Sie sind fertig!

Mehr zu Kollektionen finden Sie auf dieser Wikipage


3

Mehr optimiert

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

Dies geschieht ebenfalls standardmäßig ... siehe $this->_getClearSelect().
Sv3n
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.