You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Drupal 7中限制views_get_view_result()记录数实现分页

我之前在Drupal 7里也碰到过一模一样的需求——不想先拉全量数据再切片,毕竟数据量大的时候太耗性能。其实不用纠结array_slice,我们可以让Views本身就返回分页后的结果,直接在数据库查询阶段就做限制,下面是两个可行的方案:

方案1:手动配置View分页参数后获取结果

这是最适合你当前场景的方法:直接加载View对象,手动设置分页相关参数,让它只查询你需要的那部分数据,代码示例如下:

// 加载目标View
$view = views_get_view('test_tracking');
if ($view && $view->access('block')) {
    // 指定要使用的display(和你之前调用的block一致)
    $view->set_display('block');
    
    // 设置分片参数:每页数量和当前页码(注意页码从0开始计数)
    $items_per_page = 10; // 你希望每次获取的数据条数
    $current_page = 1;    // 要获取第2页的数据(第1页对应0)
    
    // 配置Pager参数,让View在查询时自动添加LIMIT和OFFSET
    $view->pager['items_per_page'] = $items_per_page;
    $view->pager['current_page'] = $current_page;
    
    // 传递你需要的nid参数
    $view->set_arguments(array(<nid>));
    
    // 执行查询
    $view->pre_execute();
    $view->execute();
    
    // 拿到分页后的结果
    $table_data = $view->result;
    
    // 销毁View对象,避免内存泄漏
    $view->destroy();
}

这个方法的核心是让View的Pager组件在数据库查询阶段就加入LIMIT和OFFSET条件,所以只会返回你指定分片的数据,完全不需要先拉取全量结果再处理。

方案2:利用Views原生AJAX分页(前端场景适配)

如果你的AJAX调用是从前端发起的,也可以直接调用Views自带的AJAX端点,通过传递page参数来获取指定页的数据。不过看你是用PHP函数调用,方案1应该更贴合你的需求。

额外注意点

  • 即使你的View在后台没有启用分页,手动设置上面的Pager参数依然有效;
  • 页码是从0开始计数的,比如要拿第一页数据,current_page要设为0,别搞混了。

内容的提问来源于stack exchange,提问作者Arun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:00:41