Laravel 5 - 查找模型的分页页面

Nig*_*ICU 5 php laravel laravel-5 laravel-pagination

我正在建立一个基本论坛(灵感来自 laracasts.com/discuss).当用户发布对帖子的回复时:

  • 我想用他们的回复锚点(与Laracasts相同的行为)将它们引导到分页回复列表的末尾.
  • 我还想在用户编辑其中一个回复时将用户返回到正确的页面.

如何确定将在(?page=x)上发布新回复的页面以及如何在回复编辑后返回正确的页面?或者,从主要帖子列表中,最新回复的页面是哪个页面?

这是我目前的ForumPost模型(减去几个不相关的东西) -

<?php namespace App;

use Illuminate\Database\Eloquent\Model;

/**
 * Class ForumPost
 *
 * Forum Posts table
 *
 * @package App
 */
class ForumPost extends Model {
    /**
     * Post has many Replies
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function replies()
    {
        return $this->hasMany('App\ForumReply');
    }

    /**
     * Get the latest reply for a post
     * @return null
     */
    public function latestReply()
    {
        return $this->replies()->orderBy('created_at', 'desc')->first();
    }

}
Run Code Online (Sandbox Code Playgroud)

UPDATE

看看这个,让我知道你的想法.它的工作方式有点奇怪,但它返回给定回复ID的正确页面,它只是一种方法:

public function getReplyPage($replyId = null, $paginate = 2)
    {
        $id = $replyId ? $replyId : $this->latestReply()->id;
        $count = $this->replies()->where('id', '<', $id)->count();

        $page = 1; // Starting with one page

        // Counter - when we reach the number provided in $paginate, we start a new page
        $offset = 0;

        for ($i = 0; $i < $count; $i++) {

            $offset++;
            if ($offset == $paginate) {
                $page++;
                $offset = 0;
            }
        }


        return $page;
    }
Run Code Online (Sandbox Code Playgroud)

Mir*_*ate 8

从根本上说,您正在使用两个值:首先,回复的索引与帖子的所有回复相关,第二个是页面上的回复数.

例如,您可能有一个ID为301的回复.但是,它是特定帖子的第21个回复.你需要某种方式来弄清楚它是第21个回复.这实际上相对简单:您只需计算与该帖子关联的回复数量,但具有较小的ID.

//get the number of replies before the one you're looking for
public function getReplyIndex($replyId)
{
    $count = $this->replies()->where('id', '<', $replyId)->count();
    return $count;
}
Run Code Online (Sandbox Code Playgroud)

该方法应该返回您正在寻找的回复索引 - 当然,假设您的回复使用自动增量ID.

第二部分是弄清楚你需要哪个页面.这是使用整数除法完成的.基本上你只是正常地划分数字,但不要使用余数.如果您正在查看第21个回复,并且您有10个回复页面,您知道它应该在第三页上(第1页:1-10页,第2页:11-20页,第3页:21-30页).这意味着你需要通过每页回复整数除以你的回复索引,然后加1.这将给我们21/10 + 1,使用整数除法,给我们3.耶!

//divides where we are by the number of replies on a page and adds 1
public function getPageNumber($index, $repliesPerPage)
{
    $pageNumber = (int) ($index/$repliesPerPage+1);
    return $pageNumber;
}
Run Code Online (Sandbox Code Playgroud)

好吧,现在你只需要拉那页.这只需要一种方法,您可以在其中指定所需的页码,以及对页面的回复数量.然后,该方法可以计算偏移量和限制,并检索所需的记录.

public function getPageOfReplies($pageNumber, $repliesPerPage)
{
    $pageOfReplies = $this->replies()->offset($pageNumber*$repliesPerPage)->limit($repliesPerPage)->get();
    return $pageOfReplies;
}
Run Code Online (Sandbox Code Playgroud)

但是,为了更好地衡量,我们可以构建一个方法来获取最终答复的索引.

public function getLastReplyIndex()
{
    $count = $this->replies()->count();
    return $count;
}
Run Code Online (Sandbox Code Playgroud)

大!现在我们拥有了所需的所有构建模块.我们可以构建一些简单的方法,使用我们更通用的方法来轻松检索我们需要的数据.

让我们从一个方法开始,该方法获取单个回复所在的整个回复页面(随意更改名称(我也假设每页有10个回复)):

public function getPageThatReplyIsOn($replyId)
{
    $repliesPerPage = 10;
    $index = $this->getReplyIndex($replyId);
    $pageNumber = $this->getPageNumber($index, $repliesPerPage);
    return $this->getPageOfReplies($pageNumber, $repliesPerPage);
}
Run Code Online (Sandbox Code Playgroud)

为了更好地衡量,我们可以制作一个获取最终回复页面的方法.

public function getFinalReplyPage()
{
    $repliesPerPage = 10;
    $index = $this->getLastReplyIndex();
    $pageNumber = $this->getPageNumber($index, $repliesPerPage);
    return $this->getPageOfReplies($pageNumber, $repliesPerPage);
}
Run Code Online (Sandbox Code Playgroud)

您可以构建各种其他方法来使用我们的构建块方法并跳转页面,在回复之后或之前获取页面等.

几个笔记

这些都在你的ForumPost模型中,它与你的回复应该有一对多的关系.

这些是旨在提供各种功能的各种方法.不要害怕阅读它们并单独测试它们以确切地了解它们正在做什么.它们都不是很长,所以这样做应该不难.