在我的网站上,用户可以发布"状态",其他用户可以回复/评论这些状态。例如,在我的网站的首页上,我显示了过去 3 天最喜欢的状态。
在我的家庭控制器中.php:
$statuses = Status::where('is_image', 1)
->where('is_mature', 0)
->where('created_at', '>=', Carbon::now()->subHours(168))
->orderBy('like_count', 'desc')
->take(6)
->get();
状态也可以有回复。答复使用与状态表相同的表。回复几乎只是具有"父"状态的状态,而常规状态只是没有"父"状态的状态。
从模型状态.php:
public function scopeNotReply($query) {
return $query->whereNull('parent_id');
}
public function replies() {
return $this->hasMany('CommendMeModelsStatus', 'parent_id');
}
所以回到我的主页,以下是在主页上加载状态的方式:
首页刀片.php:
@if ($statuses->count())
@foreach ($statuses as $status)
<div class="post-container">
...
blah blah blah
...
@foreach ($status->replies->reverse()->slice(0, 3) as $reply)
<div class="status-reply-content">
...
blah blah blah
...
</div>
@endforeach
@if (count($status->replies) > 3)
<a href="#">
View More Comments ({{ count($status->replies) }})
</a>
@endif
</div>
@endforeach
@endif
我想要的是"查看更多评论"按钮加载另一组 3 条评论。
如果对这些内容进行分页,这将很简单。事实上,在我的网站的其他地方,我通过ajax加载了更多的图像。这样:
if($request->ajax()) {
return [
'images' => view('browse.partials.fullview_partial')->with('images', $images->appends(request()->only('query')))->render(),
'next_page' => $images->nextPageUrl()
];
}
但是,这依赖于通过 Ajax 加载下一组分页。而$status->replies
关系没有被分页。
那么在这种情况下如何加载更多回复呢?
编辑:
即使是替代解决方案也会有所帮助。
是否需要在服务器端加载回复的第一页?我想既然你愿意用AJAX加载后续页面,你可以处理所有客户端,只有一个提供数据的AJAX端点。
只需通过状态 ID 和页码对终结点进行 ajax 调用即可。
// AjaxController
public function replies()
{
$status = Status::findOrFail(request('id'));
return $status->replies()->paginate(3);
}
(页码将自动解析。
这将返回分页器的 JSON 表示形式,其中包含上一页和下一页的 url 以及当前页面的数据。然后只需在客户端呈现数据。
我最终所做的只是在我的控制器中为请求本身创建一个新功能,然后发送状态的 ID,以及跳过计数(根据已加载的回复数量增加(以跳过加载的回复。
public function getReplies($statusID, $skip, Request $request) {
$status = Status::findOrFail($statusID);
$replies = $status->replies()->orderBy('created_at', 'desc')->skip($skip)->take(10)->get();
if($request->ajax()) {
return [
'replies' => view('templates.partials.replies')->with('replies', $replies)->render(),
];
}
}