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

2023-11-22

我正在努力建立一个基本论坛(灵感来自laracasts.com/讨论)。当用户发布对主题的回复时:

  • 我想引导他们到列表的末尾分页回复及其回复的锚点(与 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();
    }

}

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;
    }

基本上,您正在使用两个值:第一,回复索引相对于帖子的所有回复的关系,第二是页面上回复的数量。

例如,您可能有一个 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模型,它应该与您的回复具有一对多的关系。

这些方法多种多样,旨在提供广泛的功能。不要害怕通读它们并单独测试它们以准确了解它们在做什么。它们都不是很长,所以应该不难做到。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Laravel 5 - 查找模型的分页页面 的相关文章

  • python 格式日期时间,带有“st”、“nd”、“rd”、“th”(英文序数后缀),如 PHP 的“S”

    我想要一个 python datetime 对象来输出 并在 django 中使用结果 如下所示 Thu the 2nd at 4 30 但我在python中找不到输出的方法st nd rd or th就像我可以使用 PHP 日期时间格式一
  • print_r 的替代方案(仅显示最多 2 3 个键)

    我有一个multi dimensional array有 200 个键 每个键有 3 到 5 个数组 我想知道有什么方法可以只看到有限的部分 即最多 3 或 4 个键 因为如果我使用print r desiredArray 然后花费了太多时
  • PHP 获取关联数组的最后 3 个元素,同时保留键?

    我有一个数组 13 gt Array 0 gt joe 1 gt 0 14 gt Array 0 gt bob 1 gt 0 15 gt Array 0 gt sue 1 gt 0 16 gt Array 0 gt john 1 gt 0
  • 如何在 PHP 服务器上运行 Composer 更新?

    有没有办法跑composer update我们的生产 测试环境中的命令 问题是我无权访问命令行 是的 有一个解决方案 但它可能需要一些服务器配置 由于安全风险 其中一些默认是禁止的 下载composer phar https getcomp
  • PHP 如果没有已知索引,如何访问多维数组的所有元素?

    我在这里使用了代码的修改版本确定 PHP 类文件中定义了哪些类 https stackoverflow com questions 928928 determining what classes are defined in a php c
  • PHP中如何对数组的索引进行排序

    我需要在我的系统中排名 我有一个数组 arr array 120 26 38 96 22 我需要对内部索引进行排名而不改变它们的位置 我需要的输出是这样的 120 为 1 级 26 为 4 级 38 为 3 级 96 为 2 级 22 为
  • Laravel - 检查 @yield 是否为空

    如果 yield 有内容 是否可以检查刀片视图 我正在尝试在视图中分配页面标题 section title hi world 所以我想检查主布局视图 类似 对于现在 2018 年以上 查看的人 您可以使用 hasSection name y
  • .php 随机图像在外部站点上作为 .jpg

    我发布的论坛只允许从外部 URL 加载 jpg png 和 gif 图像 我想解决这个问题 并从服务器上的目录中随机选择一个动态头像 但我无法使其正常工作 可能是由于在外部站点上执行了额外的检查 或者我的代码中存在错误 到目前为止 我已经在
  • php run git 收到“ssh 权限被拒绝”

    我正在尝试从浏览器中运行 git pull php 脚本 但我得到了 sh 连接到主机 git assembla com 端口 22 权限被拒绝 我的 PHP 脚本
  • Laravel 5.3 Schema::create ENUM 字段是 VARCHAR

    我刚刚创建了新的迁移 运行后我看到了我的领域type 不是 ENUM 类型 它有一个改为 VARCHAR 255 类型 Schema create payments function Blueprint table table gt inc
  • PHP rand() ...获得真正的 50/50 结果?

    我想要运行一个具有 2 个不同结果的函数 但我希望每个结果都真正达到 50 我假设 rand 0 1 是可行的方法 但我很好奇这是否可能有利于其中一个 获得 50 50 结果的最佳方法是什么 Thanks 编辑 谢谢大家 但我不希望它是随机
  • jQuery 相当于 php 的 wordwrap?

    我正在寻找一种方法来使用 jQuery 来完成我在 php 中使用 wordwrap 可以做的事情 http php net manual en function wordwrap php http php net manual en fu
  • 在cakephp 3中动态更改数据库连接

    我正在尝试更改中使用的数据库连接蛋糕php 3在飞行中 我找到的这个问题的每个答案都指的是蛋糕PHP 2 These https stackoverflow com questions 27655613 multiple databases
  • PHP Socket Java 消息交换

    我正在尝试在 PHP 页面和正在运行的 Java 服务器之间进行通信 只是通过套接字进行简单的字符串交换 这是我处理连接的线程的 Java 代码 InputStream in clientSocket getInputStream Buff
  • MySQL 错误:列“时间”不能为空

    我收到错误 使用下面的查询时 列 时间 不能为空 第一次没有重复时工作正常 但当尝试再次更新时 我收到错误 列 时间 不能为空 mysql query INSERT INTO table Username Time Videos Credi
  • Bing 搜索 API 和 Azure

    我正在尝试以编程方式在 Microsoft Bing 搜索引擎上执行搜索 这是我的理解 有一个 Bing Search API 2 0 很快就会被替换 2012 年 8 月 1 日 新的 API 称为 Windows Azure Marke
  • 使用 Emacs 进行 Web 开发? (php/mysql/javascript/css/html

    我是一名网络开发人员 在我决定学习真正的编辑器并开始使用 emacs 之前六个月 我一直在使用各种编辑器和 ide s 进行 Web 开发 php javascript html css 我学习了所有基础知识 使用了入门套件 练习使用缓冲区
  • CodeIgniter:删除 WAMP 上 URL 中的“index.php”

    在 CodeIgniter 中 我想删除本地主机 WAMP 上 URL 中的 index php 例如 http localhost com ci index php controller function http localhost c
  • 如何在 PHP 中对数组和数据进行排序?

    这个问题旨在作为有关 PHP 中数组排序问题的参考 人们很容易认为您的特定案例是独特的并且值得提出新问题 但大多数实际上只是此页面上的解决方案之一的微小变化 如果您的问题因与此问题重复而被关闭 请仅在您能解释为什么它与以下所有问题显着不同的
  • 同一域的子页面之间的 PHP 会话

    我有一个域 domain com 其中有多个子页面 这些子页面具有不同的会话 默认情况下 并且我希望其中一些子页面共享一个会话 例如我有domain com section1 staff and domain com section2 st

随机推荐

  • 将 TensorFlow 损失全局目标 (recall_at_ precision_loss) 与 Keras(而非指标)结合使用

    背景 我有一个有 5 个标签的多标签分类问题 例如 1 0 1 1 0 因此 我希望我的模型能够改进固定召回率 精确召回率 AUC 或 ROC AUC 等指标 使用损失函数没有意义 例如binary crossentropy 这与我想要优化
  • Sass/Compass 从变量中获取变量名

    我正在尝试制作一个 mixin 它可以让我根据您使用的变量名称创建适应的代码块 foo 00A9EC mixin menu color color color color a level2 color color a level2 visi
  • WPF TextFormatter 中第二行的缩进

    我正在使用 TextFormatter 制作 WPF 文本编辑器 我需要缩进每个段落中的第二行 第二行的缩进宽度应该与第一行第一个单词的宽度相同 包括第一个单词后面的空白 像这样的东西 Indent of second line in In
  • 从 Flutter 打开 Android Activity 和 iOS ViewController

    我有一个 Flutter 项目 需要一些需要在本机 Android Activity 或 iOS ViewController 中实现的某些功能 有没有办法导航到 android Activity 并向其传递数据 并在 Flutter 中从
  • 带有 MediaCodec Surface 的 AVC 硬件编码器可靠性如何?

    我正在开发一个 Android 应用程序 该应用程序使用 MediaCodec 使用 Surface 方法对 H 264 视频进行编码 我的目标是 Android 5 0 并且遵循了 bigflake com 中的所有示例和样本 我两年前开
  • MATLAB 中的矩阵乘法时间复杂度

    有谁知道MATLAB使用哪种算法进行矩阵乘法以及它的时间复杂度是多少 为了完整起见 如中所述这个线程 Matlab 使用DGEMM 双通用矩阵乘法 例程来自BLAS 基本线性代数子程序 请注意 BLAS 不存在单一的实现 它针对特定的处理器
  • newtonsoft json序列化时间跨度格式

    是否可以指定自定义格式TimeSpan序列化 使用Newtonsoft Json 我想要格式为 HH mm 的序列化字符串 例如 TimeSpan FromHours 5 gt 05 00 TimeSpan FromHours 5 gt 0
  • 更好的 git add -p 吗?

    有时我在没有安装 X Window 的系统上工作 并且无法使用 Git GUI 现有的控制台替代品是什么git add p 我几乎喜欢它所做的一切 实际上比 Git GUI 更喜欢 但我讨厌它不允许我查看整个图片并选择我想要查看块的顺序 这
  • .forEach 中 thisArg 的用途是什么?

    JavaScript 的对于每个文档指出 forEach语法是 arr forEach callback thisArg 有什么用thisArg The thisArg可以提供改变inner this的回调函数 未指定thisArg结果是t
  • 导入 theano 时出错“无法导入名称 gof”

    我目前收到错误 导入错误 无法导入名称 gof 导入 theano 时 gt gt gt import theano Traceback most recent call last File
  • 延迟生成 powerset

    我想计算一个集合的幂集 因为我不需要一次需要整个 powerset 所以最好延迟生成它 例如 powerset set a b c seq set set a set b set c set a b set a c set b c set
  • 组合 R + awk + ​​bash 命令

    我想结合awk和R语言 问题是我在指定目录中有一组 txt 文件 并且我不知道文件头的长度 在某些情况下 我必须跳过 25 行 而在其他情况下 我必须跳过 27 行等 所以我想输入一些 awk 命令来获取要跳过的行数 一旦获得该值 我就可以
  • 当初始化固定大小的 char 数组时没有足够的空间容纳 null 终止符时,不会出现编译器错误

    假设我有以下 c char 数组 char okaysize4 5 four line 5 char toosmall4 4 four line 6 char toosmall3 3 four line 7 当我使用 gcc 4 4 7 编
  • ES6 模板文字 - 从字符串中删除 \n

    我正在将多行变量更改为Template Literals太神奇了 但后来我注意到我所做的缩进被转换 缩小 为 n与我在原始代码上所做的缩进 我怎样才能避免这种情况 Ex var div div class proj div class bo
  • 如何在 Windows 窗体中模仿 JavaScript 的 onBlur 事件?

    我在 Windows 窗体上有电话和电子邮件文本框 我想在用户离开字段时对其进行验证 当我双击 Visual Studio 表单设计器中的文本框时 它会创建一个textchanged事件 这不太合适 因为仅当用户输入完整条目时才调用验证方法
  • 如何检查 perl 中是否声明了变量?

    我在用use strict 在 perl 中 我使用以下语句 unless defined x print Not defined 其中 x 没有在任何地方声明 所以我希望它打印 Not defined 但它返回一个错误 Global sy
  • 创建 JSONObject 时 org.json 未报告异常

    谁能帮助我理解出了什么问题 unreported exception org json JSONException must be caught or declared to be thrown jsonObj new JSONObject
  • 将浮点数组转换为字符串的最快方法是什么? [复制]

    这个问题在这里已经有答案了 在 C 中将浮点数组转换为字符串的最快方法是什么 如果我的数组包含这个 0 1 1 1 1 0 0 2 然后我希望每个条目转换为一个字符串 其值由空格分隔 即 0 1 1 1 1 0 0 2 我会选择最具可读性的
  • 在数据框上使用 If/Else

    我有一个数据集 看起来像 data lt c 0 1 2 3 4 2 3 1 4 3 2 4 0 1 2 0 2 1 2 0 4 frame lt as data frame data 我现在想在此数据框中创建一个新变量 如果 数据 列报告
  • Laravel 5 - 查找模型的分页页面

    我正在努力建立一个基本论坛 灵感来自laracasts com 讨论 当用户发布对主题的回复时 我想引导他们到列表的末尾分页回复及其回复的锚点 与 Laracasts 的行为相同 我还想在用户编辑回复之一时将其返回到正确的页面 我怎样才能知