基本上,您正在使用两个值:第一,回复索引相对于帖子的所有回复的关系,第二是页面上回复的数量。
例如,您可能有一个 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;
}
该方法应该返回您正在查找的回复的索引 - 当然,假设您的回复使用自动增量 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;
}
好的,现在您只需要拉出该页面即可。这仅需要一个方法,您可以在其中指定所需的页码以及对页面的回复数量。然后该方法可以计算偏移量和限制,并检索您需要的记录。
public function getPageOfReplies($pageNumber, $repliesPerPage)
{
$pageOfReplies = $this->replies()->offset($pageNumber*$repliesPerPage)->limit($repliesPerPage)->get();
return $pageOfReplies;
}
不过,为了更好地衡量,我们可以构建一个方法来获取最终回复的索引。
public function getLastReplyIndex()
{
$count = $this->replies()->count();
return $count;
}
伟大的!现在我们已经拥有了所需的所有构建块。我们可以构建一些简单的方法,使用更通用的方法来轻松检索我们需要的数据。
让我们从一个方法开始,该方法获取单个回复所在的整个回复页面(可以随意更改名称(我还假设每页有 10 个回复)):
public function getPageThatReplyIsOn($replyId)
{
$repliesPerPage = 10;
$index = $this->getReplyIndex($replyId);
$pageNumber = $this->getPageNumber($index, $repliesPerPage);
return $this->getPageOfReplies($pageNumber, $repliesPerPage);
}
为了更好地衡量,我们可以创建一个获取最终回复页面的方法。
public function getFinalReplyPage()
{
$repliesPerPage = 10;
$index = $this->getLastReplyIndex();
$pageNumber = $this->getPageNumber($index, $repliesPerPage);
return $this->getPageOfReplies($pageNumber, $repliesPerPage);
}
您可以构建各种其他方法来使用我们的构建块方法并跳转页面、获取回复之后或之前的页面等。
一些笔记
这些都在你的ForumPost
模型,它应该与您的回复具有一对多的关系。
这些方法多种多样,旨在提供广泛的功能。不要害怕通读它们并单独测试它们以准确了解它们在做什么。它们都不是很长,所以应该不难做到。