Magento: 在集合中设置LIMIT

38

我尝试找到如何在一个集合中设置限制的方法,但在谷歌上找到的答案只适用于具有setPage($pageNum, $pageSize)的目录,对其他任何集合都无法使用。
请见下面的答案。

4个回答

123

有几种方法可以做到这一点:

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

将获得前20条记录。

这里是另一种可能更易读的方式:

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

这将调用Zend Db Limit。您可以将偏移量设置为第二个参数。


限制仅适用于目录,如果您自己的模块,则必须在集合中实现该限制,并且 limit(20) = LIMIT 0, 20 而不是 LIMIT 20, 20。如何更改页面?第一种解决方案是我下面提供的。 - Shadowbob
1
$collection->getSelect()->limit(20, 20); //限制结果为20条,从第21条开始 或者 $collection = Mage::getModel('...')->getCollection()->setPageSize(20)->setCurPage(2); //限制结果为20条,从第21条开始 - freento
1
$collection->getSelect()->limit(20, 20); 可以适用于每个集合。请参阅 Zend DB Select,这是 Magento 查询数据库的基础。 - freento
哦,抱歉我没有调用getSelect()。这个也可以工作,也许使用它会更好。 - Shadowbob
@Shadowbob:我在寻找同样的问题时来到了这里。但是我正在尝试从我的自定义模块中调用 $collection->getSelect()->limit(20);,该模块覆盖了此核心块方法 _getProductCollection()。但它会抛出一个错误,如“未识别的方法'setCurPage()'”。你有什么想法我做错了什么吗? - zamil
显示剩余2条评论

13

在Magento 1.7.2中,查看code/core/Mage/Catalog/Model/Resource/Category/Flat/Collection.php文件中第380行的setPage($pageNum, $pageSize)函数即可实现。

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

我希望这能帮助到某人。


或者只需 $collection->setPage($pageNum, $pageSize); - Pavel Novitsky
1
+Pavel的setPage仅适用于目录,而我需要在目录之外使用,就像我在问题中解释的那样。 - Shadowbob

5

订单收集限制:

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

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

2
你的例子虽然可以工作,但永远不要使用foreach从集合中加载单个实体,那是集合的用途!所以最好在你的foreach中删除前两行代码...这样它只会更快,更具可扩展性! - Rico Neitzel
嗯!在循环中进行查询。 - itsazzad

1
你也可以这样实现: setPage(1, n); 其中,n 是任意数字。
$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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接