Laravel-orderBy不处理关系收集



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

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

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

当我试图弄清真相时,我意识到帖子关系上的orderBy根本没有任何效果。无论我根据什么属性进行排序(例如created_at,sequence(以及请求哪个排序方向,都总是返回相同的post顺序和相同的第一个post。

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

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

$t->posts()->orderBy('sequence', 'asc')->first();
RiariForumModelsPost {#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();
RiariForumModelsPost {#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,
}

这是按顺序desc:排序时应该返回的帖子

RiariForumModelsPost {#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,
}

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

当您查看Thread.php源代码中的关系定义时,您会发现默认情况下posts已经由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_at')语句,然后您自己的orderBy就可以工作了。

最新更新