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
相关产品推荐
相关产品推荐

