Najbardziej efektywny sposób na uzyskanie wszystkich identyfikatorów z kolekcji

37

W przeszłości, aby uzyskać wszystkie identyfikatory kolekcji produktów, zawsze używałem getAllIdstej kolekcji, wierząc, że była to metoda, która uniemożliwiła pełne załadowanie kolekcji danymi itp.

Ale faktycznie spojrzałem dzisiaj na tę metodę, która ładuje kolekcję i iteruje każdy element, aby uzyskać tablicę identyfikacyjną.

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

Moje pytanie brzmi: jaka jest najskuteczniejsza metoda pobierania tylko pola ID z kolekcji?

Marty Wallace
źródło

Odpowiedzi:

43

W rzeczywistości getAllIdsjest to najlepszy sposób na zrobienie tego. Na przykład w modelu zasobów kolekcji produktów metoda wygląda następująco:

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

Tak więc wszystko jest pobierane z jednego wyboru i nie jest wymagana iteracja. Również w abstrakcyjnym modelu zasobów wygląda to tak:

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

Tak więc wszystko, co się rozszerza, Mage_Core_Model_Resource_Db_Collection_Abstractpowinno tego używać, chyba że określono inaczej.

Metoda, na którą patrzysz, pochodzi z klasy podstawowej, Varien_Data_Collectionale jest nadpisywana w jej elementach potomnych.

Marius
źródło
6

W takim przypadku możesz użyć obiektu kolekcji

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

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

addAttributeToSelectbo entity_idtak naprawdę nie jest wymagane, ale dla celów demonstracyjnych włożyłem to, dodaj pola, których potrzebujesz i gotowe!

Więcej o kolekcjach znajdziesz w tym Wikipedii

Sander Mangel
źródło
3

Bardziej zoptymalizowany

$collection = Mage::getModel('catalog/product')->getCollection();
$collection->getSelect()->reset(Zend_Db_Select::COLUMNS);
$collection->getSelect()->columns('entity_id');
$collection1Ids[] = $collection->getAllIds();
Hassan Ali Shahzad
źródło
Odbywa się to również domyślnie ... patrz $this->_getClearSelect().
sv3n