【已解决】Laravel paginate()分页后 出现数据重复 或 数据丢失问题

【已解决】Laravel paginate()分页后 出现数据重复 或 数据丢失问题

问题情景描述:

  1. 已知有一张学生表与一张消费积分表。现根据每个学生的消费积分对学生表进行正序排列(即积分从高到低排列)。
  2. 学生表students 与 消费积分表orders表为一对多关系(一条学生数据 对应 多条投票积分数据)。

数据表格示例

学生表(students)

idname(学生名称)
1李苦瓜
2脸盆王
3老木棍

消费积分表(orders)

idvote(投票)students_id(学生表id)is_pay(是否支付)
1211
2331
3410
4521
5211
6121
7321
8211
9631

错误代码示例

此时获取的数据后前端使用laravel自带的分页$data->links();会发生丢失数据 或者数据重复的问题

public function studentList(Request $request){
		//获取学生列表
        $data = Student::select('students.*',DB::raw('(SELECT SUM(contribution_value) FROM orders WHERE orders.students_id = students.id and orders.is_pay = 1) as sum_contribution_value'))
        ->orderBy('sum_contribution_value','desc')
        ->paginate(10);
        return view('h5.student.studentList',compact('data'));
    }

错误数据渲染后的示例图:
在这里插入图片描述
在这里插入图片描述

解决方案:

正确代码示例:

public function studentList(Request $request){
		//获取学生列表
        $data = Student::select('students.*',DB::raw('(SELECT SUM(contribution_value) FROM orders WHERE orders.students_id = students.id and orders.is_pay = 1) as sum_contribution_value'))
        ->orderBy('sum_contribution_value','desc')
        >orderBy('students.id','desc')//加入此行代码。order by因为排序不唯一,所以每次查询数据的顺序不一样,导致分页截取的数据片段有重复数据或造成数据丢失
        ->paginate(10);
        return view('h5.student.studentList',compact('data'));
    }

返回数据出现丢失或重复的原因

由上述错误代码示例中所示:->orderBy('sum_contribution_value','desc')仅使用了这此标识进行排序,但此表示不是对整个返回的数据而言不是唯一标识!
Mysql使用order by排序时因为排序标识不唯一,所以每次查询数据的顺序不一样,导致分页截取的数据片段有重复数据或造成数据丢失。
所以加入最后在用唯一标识字段进行下排序即可(比如表的唯一id或者订单编号之类的带有唯一约束的字段)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Laravel 中,我们可以通过自定义 Paginator 类来实现自定义分页数据结构。 首先,我们需要创建一个新的 Paginator 类,可以在 `app` 目录下创建一个 `CustomPaginator.php` 文件。在这个类中,我们需要继承 Laravel 内置的 Paginator 类,并实现 `__construct` 和 `toArray` 方法。例如: ```php <?php namespace App; use Illuminate\Pagination\Paginator; class CustomPaginator extends Paginator { public function __construct($items, $perPage, $currentPage, $options = []) { parent::__construct($items, $perPage, $currentPage, $options); } public function toArray() { return [ 'data' => $this->items->toArray(), 'pagination' => [ 'total' => $this->total(), 'count' => $this->count(), 'per_page' => $this->perPage(), 'current_page' => $this->currentPage(), 'total_pages' => $this->lastPage() ] ]; } } ``` 在上面的代码中,我们在 `toArray` 方法中定义了自定义的分页数据结构,包括数据分页信息。其中,`data` 表示当前页的数据,`pagination` 表示分页信息。你可以根据自己的需求修改这个数据结构。 然后,在使用自定义分页数据结构的时候,可以使用 `CustomPaginator` 类来实现。例如: ```php use App\CustomPaginator; $items = DB::table('users')->paginate(15); $customPaginator = new CustomPaginator($items->items(), $items->perPage(), $items->currentPage()); $result = $customPaginator->toArray(); ``` 在上面的代码中,我们先使用内置的 `paginate` 方法来获取分页数据,然后将其转换成自定义的分页数据结构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值