如何使用Laravel Pagination获取不冗余的注释?

时间:2018-02-16 16:42:16

标签: javascript laravel vue.js

我的主要问题:

如果用户撰写评论并且 然后 决定加载更多评论,他将至少看到一个冗余评论

因果关系:

通过Laravel Pagination,脚本通过Axios加载最后10个项目。添加一条评论并再次获取下一个10项后,"顺序"是一个元素的转移。因此,得到一个重复元素。

尝试修复它:

首先尝试: 我尝试使用Array.prototype.includes()或Lodash Includes:

 data(){
    return { items: [] };
 }
 ...
 addWithoutRedudancy(newItems){
    for(let item of newItems){
        if( ! _.includes( this.items, item ) ) this.items.push(item);
    }
 }

发生问题:

  1. 即使我看起来有两个相同的对象,如果我检查,我会在控制台中输入错误:

    $vm0.items[10] == $vm0.items[11] //False even though objects look the same, and actually are (looking to all properties)
    

    这是一个很大的问题,因为包裹无法找到冗余的对象!我不知道为什么这些对象的保存方式不同。也许是因为我在两个不同的时间上通过axios取了它们?

  2. 但是即使它可以工作,在用户写了8个新评论后,他只会从分页(控制器)中获得2条新评论,但当然应该得到接下来的10条评论。

  3. 第二次尝试

    /**
     * Fetch all relevant comments.
     *
     * @param string $username
     * @param Selllink $selllink
     */
    public function index($username, $selllink)
    {
        //Route::prefix('/{username}/{selllink}
        //Sellink gets the model of sell and loads all comments to that sell.
        //get me the latest first (we want to see the current comments)
        //take only 10 coments with paginatation
    
        return $selllink->sell->comments()
                    ->latest()
                    ->offset($addedCommentsNumber??) //that can't work...
                    ->paginate(10);
    }
    

    发生问题:    我无法真正抵消整张桌子。我需要抵消分页的那些并再次添加缺失的那些。

    结论

    必须有一个更好的方法来做到这一点。但我不知道怎么做。

    更多详情说明(如果需要):

    我有 Vue评论组件,可以通过分页从我的 CommentController 获取数据:

    methods: {
            fetch(){
                axios.get(this.url()).then(this.refresh);
            },
            url() {
                this.page++;
                return `${location.pathname}/comments?page=${this.page}`;
            },
            refresh({data}){
                this.dataSet = data;
                this.addWithoutRedudancy(data.data);
            },
    }
    

    如果用户希望获得更多评论,则只需点击"加载更多"按钮,我正在加载评论

1 个答案:

答案 0 :(得分:0)

我要感谢@James。我使用WHERE查询

保存所有提取的注释+的最后一个ID

我将Vue方法更改为:

url() {
    this.page++;
    return `${location.pathname}/comments?page=${this.page}&lastComment=${this.idOfLastComment}`;
},

在我的控制器中:

/**
 * Fetch all relevant comments.
 *
 * @param string $username
 * @param Selllink $selllink
 */
public function index($username, $selllink)
{
    $commentID = request('lastComment', $default = 0);
    $filter = $commentID == 0 ? '>' : '<=';

    return $selllink->sell->comments()
                ->where('id', $filter, $commentID)
                ->latest()
                ->paginate(10);
}

完美地工作:)