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?

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.


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


3

Bardziej zoptymalizowany

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

Odbywa się to również domyślnie ... patrz $this->_getClearSelect().
sv3n
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.