我的网站上有文章,文章有评论。
当有人拉起一篇文章时,默认的评论排序是“新建”。
我的第一个控制器将拉起这篇文章和 10 条评论(我只使用 10 条用于测试目的,实际上它会像 200 条)。
$submission = Submission::where('id', $id)->first();
$comments = Comment::where('submission_id', $submission->id)
->where('parent_id', NULL)
->orderBy('removed','asc')
->orderBy('created_at', 'desc')
->paginate(10);
我还有第二个控制器,用于通过 AJAX 加载对文章的更多评论。
public function loadMoreNewComments($submissionID, $skip, Request $request) {
$submission = Submission::findOrFail($submissionID);
if($request->ajax()) {
$comments = $submission->comments()->orderBy('created_at', 'desc')->skip($skip)->take(10)->get();
return [
'replies' => view('partials.comment_loop')->with('submission', $submission)->with('comments', $comments)->render(),
];
}
}
这将使当您单击“查看更多评论”按钮时,您会获得 10 个以上的结果。
这使用了一个$skip计数,它根据已加载的数量跳过一定数量的结果。因此,由于在此示例中我们一次加载 10,因此第一次$skip计数将为 10,然后第二次将是 20,然后是 30,依此类推,然后将take(10)在跳过的那些之后产生结果。
这是我的刀片视图中的样子:
<div id="comment-thread-container">
@foreach ($comments as $comment)
@include('partials.comment_block')
@endforeach
</div>
@if ($comments->total() > 10)
<span id="viewMoreNewComments" data-submission-id="{{ $submission->id }}" data-skip="10">
<i class="fa fa-comments" aria-hidden="true"></i>
View More Comments (<span id="viewComments-count">{{$comments->total() - 10}}</span>)
</span>
@endif
现在这将工作得很好,直到您有用户在您加载页面后发表评论。
因为当用户在您加载页面后发表评论时,它会将计数设置为 1。
因此,例如,如果您加载一篇文章,并且当您阅读该文章时,又有 3 条评论,如果您单击“查看更多评论”按钮,您将看到 3 条已加载的重复评论。
我不知道如何解决这个问题。一旦我按“最佳分数”实施排序,这将是一个更大的问题,因为评论可以有赞成票和反对票,因为从用户开始阅读文章到他们完成时,评分最高的评论可能会发生巨大变化。
什么是解决这个问题的方法?保留已加载到缓存中的所有评论 ID 的数组,然后在每个请求中传递该数组?或者有更优雅的解决方案吗?
ABOUTYOU