Magento Collection

Da Andreabont's Wiki.

Dichiarazione

Magento 1

$collection = Mage::getModel('module/model')->getCollection();

Magento 2

NB: E' consigliato utilizzare il sistema di dependency injection fornito dal framework, e non istanziare direttamente l'oggetto.

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$collection = $objectManager->create('PathTo/Model/Collection');

Selezione

E' possibile selezionare attivamente dei campi dell'entità che devono essere caricati...

$collection->addFieldToSelect('attributo');     // Per le entità flat
$collection->addAttributeToSelect('attributo'); // Per le entità EAV

Filtri

E' possibile filtrare le entità...

$collection->addFieldToFilter('attributo', Array('condizione' => 'valore'));     // Per le entità flat
$collection->addAttributeToFilter('attributo', Array('condizione' => 'valore')); // Per le entità EAV

Se è necessario mettere dei filtri in condizione OR:

// Per entità flat
$collection->addFieldToFilter(
    Array(
        'attributo1',
        'attributo2'
    ),
    Array(
        Array('condizione1' => 'valore1'),
        Array('condizione2' => 'valore2')
    )
);

// Per entità EAV
$collection->addAttributeToFilter('attributo',
    Array(
        'attributo1',
        'attributo2'
    ),
    Array(
        Array('condizione1' => 'valore1'),
        Array('condizione2' => 'valore2')
    ),
    'tipojoin'
);

Join

$collection->getSelect()->join(
    Array('alias' => 'tabella'),
    'condizione',
    Array('alias' => 'attributo')
);

Iterazione

Semplice

foreach($collection as $item) {
    // CODICE...
}

Paginazione

Possiamo paginare scorrendo normalmente le pagine...

$collection->setPageSize(100);
$pageNumber = $collection->getLastPageNumber();
$currentPage = 1;

do {

    $collection->setCurPage($currentPage);
    $collection->load();

    foreach($collection as $item) {
         // CODICE...
    }

    $currentPage++;
    $collection->clear();

} while($currentPage <= $pageNumber);

Oppure se stiamo consumando i dati, caricare sempre la prima pagina finché non finiscono...

$collection->setPageSize(100);
$collection->setCurPage(1);

while($collection->count() != 0) {

    foreach($collection as $item) {
         // CODICE...
    }

    $collection->clear();

}

Cursore

E' possibile scorrere la collection caricando un entità per volta...

while($item = $collection->fetchItem()) {
    // Codice...
}