2013-01-14 3 views
35

La question que j'ai essayé de trouver était de savoir comment définir une limite sur une collection, les réponses que j'ai trouvées sur Google étaient uniquement disponibles pour le catalogue avec un setPage ($ pageNum, $ pageSize). Cela n'a pas fonctionné sur d'autres collections.
Voir la réponse ci-dessous.Magento: Définir LIMIT sur la collection

Répondre

107

Il y a plusieurs façons de le faire:

$collection = Mage::getModel('...') 
      ->getCollection() 
      ->setPageSize(20) 
      ->setCurPage(1); 

obtiendrai 20 premiers dossiers.

Voici la alternative et peut-être plus lisible:

$collection = Mage::getModel('...')->getCollection(); 
$collection->getSelect()->limit(20); 

Ceci appellera limite Zend Db. Vous pouvez définir le décalage en tant que deuxième paramètre.

+0

limite est seulement pour le catalogue aussi, si vous faites votre propre module, vous devrez implémenter cela dans votre collection, et 'limite (20) = LIMIT 0, 20' et pas 'LIMIT 20, 20' comment changer la page ? La première solution est celle que je mets ci-dessous. – Shadowbob

+1

$ collection-> getSelect() -> limite (20, 20); // LIMIT 20, 20 OU $ collection = Mage :: getModel ('...') -> getCollection() -> setPageSize (20) -> setCurPage (2); // LIMIT 20, 20 – freento

+1

$ collection-> getSelect() -> limit (20, 20); travaillera pour chaque collection. Voir Zend DB Select, sur lequel sont basées les requêtes Magento vers DB. – freento

10

La façon de faire était à la recherche du code code/core/Mage/Catalog/Model/Resource/Category/Flat/Collection.php à la ligne 380 dans Magento 1.7.2 sur la fonction setPage($pageNum, $pageSize)

$collection = Mage::getModel('model') 
    ->getCollection() 
    ->setCurPage(2) // 2nd page 
    ->setPageSize(10); // 10 elements per pages 

J'espère que cela aidera quelqu'un.

+0

ou juste '$ collection-> setPage (pageNum $, $ pageSize)' –

+1

+ Pavel ne setPage est seulement pour le catalogue et moi avions besoin en dehors du catalogue comme je l'ai expliqué dans la question. – Shadowbob

4

Collection ordre limite:

$orderCollection = Mage::getResourceModel('sales/order_collection'); 
$orderCollection->getSelect()->limit(10); 
$orderModel = Mage::getModel('sales/order'); 

foreach ($orderCollection->getItems() as $order) : 
    $order = $orderModel->load($order['entity_id']); 
    echo $order->getId().'<br>'; 
endforeach; 
+0

wow ... allez-y ... –

+2

Votre exemple fonctionne, mais n'utilisez jamais un foreach pour charger des entités uniques à partir d'une collection. Voilà à quoi sert une collection! Tellement mieux enlever les deux premières lignes dans votre foreach ... cela fonctionnera juste mais est beaucoup plus rapide et plus évolutif! –

+0

hmm! interroger dans une boucle – itsazzad

1

Vous pouvez implémenter cela aussi: - setPage (1, n); où, n = n'importe quel nombre.

$products = Mage::getResourceModel('catalog/product_collection') 
       ->addAttributeToSelect('*') 
       ->addAttributeToSelect(array('name', 'price', 'small_image')) 
       ->addFieldToFilter('visibility', Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH) //visible only catalog & searchable product 
       ->addAttributeToFilter('status', 1) // enabled 
       ->setStoreId($storeId) 
       ->setOrder('created_at', 'desc') 
       ->setPage(1, 6);