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?

Marty Wallace
quelle

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.

Marius
quelle
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

Sander Mangel
quelle
3

Mehr optimiert

$collection = Mage::getModel('catalog/product')->getCollection();
$collection->getSelect()->reset(Zend_Db_Select::COLUMNS);
$collection->getSelect()->columns('entity_id');
$collection1Ids[] = $collection->getAllIds();
Hassan Ali Shahzad
quelle
Dies geschieht ebenfalls standardmäßig ... siehe $this->_getClearSelect().
Sv3n