当前位置: 首页 > 知识库问答 >
问题:

Laravel-orderBy不处理关系集合

汪明德
2023-03-14

我最近将Laravel网站移动到具有相同设置的不同服务器(php、Mariadb等版本略有不同),并遇到了一个有趣的问题。

我正在使用包Team Tea Time/laravel forum(以前的riari/laravel forum)来提供留言板功能。在论坛中,每个帖子都有一个链接,可以链接到最新的帖子,在移动之前效果很好。在移动之后,这些链接将指向最旧/第一篇帖子。

该功能是线程模型的一部分,特别是函数getLastPostAttribute()。

当我试图弄清这一点时,我意识到posts上的orderBy关系根本没有任何影响。无论我按什么属性(例如created\u at,sequence)排序,也不管我请求的是哪个排序方向,都会返回相同的post顺序和相同的第一篇post。

具有1811个具有不同时间戳和序列号的帖子的线程示例:

按顺序排序ASC工作正常,第一个帖子是带有smalles序列号的帖子。然而,这也是该关系的默认顺序(请参见模型)。

$t->posts()->orderBy('sequence', 'asc')->first();
Riari\Forum\Models\Post {#3268
    id: 113544,
    thread_id: 3995,
    author_id: 191,
    sequence: 1,
    created_at: "2018-05-08 08:21:20",
    updated_at: "2018-05-08 10:51:41",
    deleted_at: null,
    vote_count: 0,
}

现在,当我将排序顺序更改为desc时,它应该返回序列号最高的post。但是我得到了与上面相同的结果。

$t->posts()->orderBy('sequence', 'desc')->first();
Riari\Forum\Models\Post {#3297
    id: 113544,
    thread_id: 3995,
    author_id: 191,
    sequence: 1,
    created_at: "2018-05-08 08:21:20",
    updated_at: "2018-05-08 10:51:41",
    deleted_at: null,
    vote_count: 0,
}

这是按顺序描述排序时应返回的帖子:

Riari\Forum\Models\Post {#3332
    id: 196449,
    thread_id: 3995,
    author_id: 534,
    sequence: 1814,
    created_at: "2020-12-16 14:55:54",
    updated_at: "2020-12-16 14:55:54",
    deleted_at: null,
    vote_count: 0,
}

以前有人经历过吗?搬家后其他一切都很好,我不知道是什么导致了这样一个特定的错误。

共有1个答案

都阳辉
2023-03-14

当您查看Thread.php源代码中的关系定义时,您会看到帖子默认情况下已经由created_at排序:

public function posts()
{
        $withTrashed = config('forum.preferences.display_trashed_posts') || Gate::allows('viewTrashedPosts');
        $query = $this->hasMany(Post::class)->orderBy('created_at');
        return $withTrashed ? $query->withTrashed() : $query;
}

我认为您需要重写posts方法,删除orderBy('created\u at')语句,然后您自己的orderBy就可以工作了。

 类似资料:
  • 问题内容: 我正在尝试获得最受欢迎的黑客马拉松,这需要通过各自的黑客马拉松订购。抱歉,这有点难以理解。 我有以下格式的数据库: 该模型是: 并定义为: 我已经尝试过,但是我觉得我犯了一个大错误(可能是$ this-> id),因为它根本不起作用。 我将如何尝试获取基于最多的相关hackathon参与者的最受欢迎的hackathon? 问题答案: 编辑:如果使用Laravel 5.2或更高版本,请使

  • 请查看下面的代码。 我在“CompletedService”中有多条记录,并且在account表中有一个父id account\u id。我和你约会是为了钱。 ASC和DESC已经尝试过了。 尝试按whereHas排序,但不会影响任何记录。下面是模型关系。 我不需要在模型中使用orderby,因为我多次使用了这个关系,并且在这个查询中只需要orderby。 与一个已完成的服务记录关系只有一个账户。

  • 我想知道如何在透视表created_at上使用orderby。 目前我有这个: 用户 活动 订阅[用户id、事件id、创建时间、更新时间] 我想让所有用户订阅特定的事件ID: 我将所有用户附加到特定事件上,但orderBy不起作用。我想使用的方式有没有连接方法。

  • 问题内容: 有没有办法在laravel中合并2个关系? 这是现在设置的方式,但是有没有办法我可以将两者合并? 问题答案: 试用属性的getter方法,该方法返回从关系返回的合并集合。 或者,您可以在返回集合之前调用其他方法以获取不同的结果集。

  • 我有3个模型和一个透视表: 学校年-模型 ID 课程模式 ID schoolyear_id 课程\学生-数据透视表 课程号 学生证 学生模型 ID 关系是: 一学年有许多课程 一门属于任何学生的课程 在任何课程中的学生 什么是最快、更优雅的方法来找到学生进入一个学年,并且能够按学生属性进行排序?

  • 我使用的是Laravel作业批处理功能,我有一个仪表板,可以显示批处理的进度(已处理、失败、挂起的作业…等等)。 每个用户都有自己的仪表板,我想根据登录用户显示Batch的进度,但我看不到与批处理表的用户模型有任何关系。 是否有可能以某种方式与这些表建立关系?还有其他选择吗? 谢谢