当前位置: 首页 > article >正文

PHP:实现两张无关联表数据的联合分页处理方案

前言

在现代软件开发中,高效地处理数据是至关重要的环节。尤其是在使用 PHP 进行开发时,常常会遇到各种复杂的数据处理需求。其中,实现两张无关联表数据的联合分页处理就是一个具有挑战性的任务。这种需求在很多实际应用场景中都可能出现,例如在管理系统中需要同时展示来自不同数据源的数据,并进行分页以便用户更好地浏览。本文将深入探讨如何使用 PHP 来实现两张无关联表数据的联合分页处理方案,为开发者提供实用的技术指导和解决方案。

解决方案

以下方法需借助 ThinkPHP(TP)框架来完成,并且该方法是为前端提供的接口,用于实现两张无关联表数据的联合分页处理。ThinkPHP 框架以其高效、便捷的开发特性,为开发者提供了强大的工具支持。通过这个接口,前端可以更加方便地获取经过处理后的分页数据,提升用户体验和系统的整体性能。

/* 分类和列表的数据需要合在分页,且先获取分类的数据 
$page 接口或者方法接收的当前获取页数
$limit 接口或者方法接收的每页条数
*/

// 构建分类和列表的数据库查询对象 where查询条件可自定义
$type_db = Db::name('bucket_type')->where($where_type)->order('id','desc');
$bucket_db = Db::name('bucket')->where($where_bucket)->order('id','desc');

$type_count = $type_db->count();  // 分类数据总条数
$bucket_count = $bucket_db->count();  // 列表数据总条数

$count = $type_count + $bucket_count;  // 合并数据总条数
$last_page = ceil($count / $limit);  // 合并数据总条数
$current_page = $page;  // 当前获取第几页的数据

// 初始化结果数组
$result = [];
$result['total'] = $count;
$result['last_page'] = $last_page;
$result['current_page'] = $current_page;
$result['data'] = [];

$type_last_page = ceil($type_count / $limit);  // 分类总页数
$bucket_last_page = ceil($bucket_count / $limit);  // 列表总页数

$result['type_last_page'] = $type_last_page;
$result['bucket_last_page'] = $bucket_last_page;

if ($current_page <= $type_last_page) {
    // 若当前页小于等于分类总页数,获取分类列表
    // paginate为tp框架自带的分页
    $type_list = $type_db->paginate(['list_rows'=>$param['limit'],'page'=>$page])->toArray();
    $result['data'] = $type_list['data'];
    if (count($type_list['data']) < $limit) {
        // 若分类列表数据不足,计算还需要的数量
        $need_count = $limit - count($type_list['data']); // 还需要几条
        if ($bucket_last_page > 0) {
            // 获取相应数量的列表并合并到结果中
            $bucket_list = $bucket_db->paginate(['list_rows'=>$need_count,'page'=>1])->toArray();
            $result['data'] = array_merge($result['data'], $bucket_list['data']);
        }
    }
} else {
    // 若当前页大于分类总页数,计算所需的列表页
    $need_page = $current_page - $type_last_page;
    $need_del_count = 0;
    if ($type_last_page && $type_last_page < $current_page) {
        // 计算需要删除的数量
        $type_list = $type_db->paginate(['list_rows'=> $limit,'page'=> $type_last_page])->toArray();
        if (count($type_list['data']) < $limit) {
            $need_del_count = $limit - count($type_list['data']);
        }
    }
    if ($bucket_last_page > 0) {
        // 获取列表数据
        $bucket_list = $bucket_db->paginate(['list_rows'=> $limit,'page'=> $need_page])->toArray();
        
        if ($need_del_count > 0) {
            $need_bucket_list = $bucket_db->paginate(['list_rows'=> $limit,'page'=> $need_page + 1])->toArray();
            $bucket_list['data'] = array_slice($bucket_list['data'], $need_del_count);
            $need_bucket_list['data'] = array_slice($need_bucket_list['data'], 0, $need_del_count);
            $bucket_list['data'] = array_merge($bucket_list['data'], $need_bucket_list['data']);
        }
        $result['data'] = $bucket_list['data'];
    }
}
// $result为返回的结果

此方法为个人思路,若在使用过程中发现任何问题,欢迎随时反馈。我们可以共同探讨、相互学习,以实现共同进步和提升。如需转载请注明出处


http://www.kler.cn/a/430240.html

相关文章:

  • Nginx入门笔记
  • Wsl报 不存在具有提供的名称的分布
  • C# XPTable 带图片的增删改查(XPTable控件使用说明十三)
  • Python中的可变对象与不可变对象;Python中的六大标准数据类型哪些属于可变对象,哪些属于不可变对象
  • C#语言的网络编程
  • 【机器学习:八、逻辑回归】
  • 我们跟面试训练营不冲突
  • 深度学习基础--yolov5网络结构简介,C3模块构建
  • 国内外网络安全政策动态(2024年11月)
  • 科技绽放-EtherCAT转Profinet网关智能连接项目
  • 功能篇:JAVA实现自定义注解
  • 记账管理系统网页版
  • UTONMOS解读元宇宙惊艳应用案例
  • python将字符串类型的字典以json格式保存到数据库教程
  • 【算法】数组中,求K个最大值
  • Advanced Functional Materials 光驱动连续跳跃机器人
  • SpringBoot【二】yaml、properties两配置文件介绍及使用
  • yocto的xxx.bb文件在什么时候会拷贝文件到build目录
  • Java设计模式 —— 【创建型模式】建造者模式详解
  • 鸿蒙 Next 可兼容运行 Android App,还支持出海 GMS?
  • VLM-OCR-Demo:一个使用VLM用于OCR任务的示例
  • Java 设计模式~工厂模式
  • 工业—使用Flink处理Kafka中的数据_EnvironmentData2
  • 【爬虫】– 抓取原创力文档数据
  • Python 类的设计(以植物大战僵尸为例)
  • 3D Gaussian Splatting代码详解(一):模型训练、数据加载