通过Laravel中的ajax加载更多雄辩的有多个关系查询?

Fel*_*ime 8 php ajax jquery pagination laravel

在我的网站上,用户可以发布"状态",其他用户可以回复/评论这些状态.例如,在我网站的首页上,我显示了过去3天内最受欢迎的状态.

在我的HomeController.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();
Run Code Online (Sandbox Code Playgroud)

状态也可以有回复.回复使用与状态表相同的表.回复几乎只是具有"父"状态的状态,而常规状态只是没有"父"的状态.

从模型status.php:

public function scopeNotReply($query) {
    return $query->whereNull('parent_id');
}

public function replies() {
    return $this->hasMany('CommendMe\Models\Status', 'parent_id');
}
Run Code Online (Sandbox Code Playgroud)

回到我的主页,这里是如何在主页上加载状态:

home.blade.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
Run Code Online (Sandbox Code Playgroud)

我想要的是"查看更多评论"按钮加载另一组3条评论.

如果将它们分页,这将很简单.事实上,在我网站的其他地方,我通过ajax加载更多图像.像这样:

if($request->ajax()) {
    return [
        'images' => view('browse.partials.fullview_partial')->with('images', $images->appends(request()->only('query')))->render(),
        'next_page' => $images->nextPageUrl()
    ];
}       
Run Code Online (Sandbox Code Playgroud)

然而,这依赖于通过ajax加载下一组分页.而这种$status->replies关系并没有分页.

那么如何在这种情况下加载更多回复呢?

编辑:

即使是替代解决方案也会有所帮

ale*_*ino 5

你需要加载服务器端的第一页回复吗?我想因为你愿意用AJAX加载后续页面,你可以只处理所有客户端,只需要一个提供数据的AJAX端点.

只需对端点进行ajax调用,即可传递状态ID和页码.

// AjaxController
public function replies()
{
    $status = Status::findOrFail(request('id'));
    return $status->replies()->paginate(3);
}
Run Code Online (Sandbox Code Playgroud)

(页码将自动解析.)

这将返回分页器的JSON表示,其具有前一页和下一页的URL以及当前页的数据.然后只渲染数据客户端.


Fel*_*ime 2

我最终所做的只是在控制器中为请求本身创建一个新函数,然后发送状态 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(),
        ];
    }   
}
Run Code Online (Sandbox Code Playgroud)