使用 distinct () 后用 分页 paginate 总数数据总数有误,求解

$result = $data->select('posts.id','posts.title'')->distinct()->paginate($page_size,['posts.id']);
直接get数据是188 但是paginate之后总数变成了193

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 2

思路一:手动分页
思路二: 自动分页之后, 再次进行手动分页(由于业务逻辑限制, 所以有了第二次手动分页(本人是不推荐的!))
思路一的手动分页功能有好多文章有写, 所以就不写了.

以下是思路二的代码:
我自己的案例代码如下:
// rows -- 查询构建器, 里边有各种查询条件

    if ((isset($queryData['assists']) && $queryData['assists'] == '是') || (isset($queryData['copy']) && $queryData['copy'] == '是')) {
        // 复制对象
        $assistsOrCopyRows = clone $rows;
    }

    $rows = $rows->orderBy('plans.created_at', 'desc')
        ->orderBy('plans.id')
        ->select(['plans.id'])
        ->paginate(
            @$queryData['per_page'] ?: 10,
            ['*'],
            'page',
            @$queryData['page'] ?: 1
        );

    // 协同计划, 抄送计划 需要重新进行手动分页, 因为有group By
    if ((isset($queryData['assists']) && $queryData['assists'] == '是') || (isset($queryData['copy']) && $queryData['copy'] == '是')) {

        // 为重新手动分页, 查询记录总数
        $total = DB::table(DB::raw("({$assistsOrCopyRows->select('plans.id')->toSql()}) as a"))
            ->mergeBindings($assistsOrCopyRows->getQuery())
            ->count('*');

        $queryData['per_page'] = (isset($queryData) && !empty($queryData['per_page'])) ? $queryData['per_page'] : 10;

        // 重新进行手动分页
        $rows = new LengthAwarePaginator($rows->toArray()['data'], $total, $queryData['per_page'] );

    }

    // 手动组装数据
    $rows = [
        'data' => $rows->toArray()['data'],
        'meta' => (new DataArraySerializer)->paginator(new IlluminatePaginatorAdapter($rows))
    ];
4年前 评论

使用paginate()第二个参数,指定列名
file

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!