【问题标题】:Laravel 5.2 pagination + infinite scroll duplicatesLaravel 5.2 分页 + 无限滚动重复
【发布时间】:2016-11-25 03:31:57
【问题描述】:

我在我的 Laravel 应用程序中遇到了分页问题。 通常,当我想使用 Laravel 分页时,假设一页有 3 行,我使用 Eloquent 方法 paginate/simplePaginate 结合方法 latest() 如下:

//MyController.php
$posts= Post->latest()->paginate(3);


//MyView.blade.php
@foreach ($posts as $post)
   {{ $post->id }}
@endforeach

{{ $posts->links() }}

所以当我的数据库中有 6 个帖子并且我使用 Laravel 分页 + 无限滚动时,就会变成:

6 
5   (1. page) 
4
--- ('page separator') 
3 
2   (2. page) 
1

但是,如果用户在我到达第 2 页之前将新行插入到数据库表中, 集合发生变化,第二页数据变为:

6 
5   (1. page) 
4
---   POST WITH ID 4 IS DUPLICATED BECAUSE OF SHIFT IN COLLECTION
4
3   (2. page) 
2

因此,例如 --- 如果用户在我到达分页器之前将三个新行插入数据库,那么第二页将输出与我当前第一页相同的三个表行,但我想输出剩余的表行:

6 
5   (1. page) 
4
--- AT SOME TIME BEFORE PAGINATION WAS TRIGGERED, POST WITH ID '7' HAS BEEN ADDED
3 
2   (2. page) - continues normally with remaining rows (pagination ignores newly added row)
1

这个问题有解决办法吗?

谢谢。

【问题讨论】:

  • 在查询中使用最新项目的id。您可以在页面向下滚动时发送最新的 id。
  • 您好,谢谢您的回答。这听起来是个好主意,但我不知道该怎么做;页面加载后是否可以向 Laravel 控制器发送一些变量?
  • 当您向下滚动页面时,在每个列表的底部,您发送一个 xhr 以从 api 检索新项目,并使用该请求发送 id。
  • 对不起,我不太明白如何使用 Laravel 中内置的分页功能来做到这一点。我需要自己写分页函数还是可以继续使用 Laravel 的?

标签: laravel pagination duplicates infinite-scroll


【解决方案1】:

你可以试试这个:

$posts= Post->orderBy('id', 'desc')
            ->distinct()
            ->paginate(3);

【讨论】:

  • 感谢您的意见。试过了,还是不行,问题依旧:(
  • 我猜,你的前端部分可能有问题。尝试查看前端的分页按钮。可能,您的无限滚动代码按下了错误的按钮。您可以尝试使用“简单分页”代替laravel.com/docs/5.1/pagination#basic-usage 它显示来回按钮而不是数字按钮。
  • 当你的行数超过 6 行时,你的无限滚动的 JS 代码可能会在你的 HTML 代码中使用错误的按钮。
  • 无限滚动触发右页按钮;如果没有新行添加到数据库中,一切正常。只有当用户在无限滚动生成的第二页之前插入新行时,第一页的最后一行才会因为帖子集合的移动而重复(新帖子被添加到集合的顶部)。
【解决方案2】:

我通过询问所服务的第一页的第一条记录 id 解决了这个问题

// {initial query} $records->orderBy('created_at', 'desc');

    if(is_int($last_id)){
        $records = $records->where('id', '<=' , $last_id);
    }

    $records = $records->paginate($per_page);

这样,分页器从该id开始获取记录,忽略新记录

【讨论】:

    猜你喜欢
    • 2016-10-23
    • 2016-01-18
    • 2015-10-29
    • 2014-08-24
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多