Php Laravel-orderBy不处理关系集合
最近,我将一个Laravel网站移动到另一台具有相同设置的服务器上(php、mariadb等的版本稍有不同),遇到了一个有趣的问题 我正在使用这个包(以前是riari/laravel论坛)来提供留言板功能。在论坛中,每个帖子都有一个链接,可以链接到最新的帖子,在移动之前效果很好。移动后,这些链接将指向最旧/第一篇帖子 该功能是的一部分,特别是函数getLastPostAttribute() 当我试图弄清这一点时,我意识到posts关系中的orderBy根本没有任何影响。无论我按什么属性排序(例如创建的、顺序)和我请求的排序方向,它始终是相同的后序和返回的相同的第一个后序 具有1811个具有不同时间戳和序列号的帖子的线程示例: 按序列ASC排序工作正常,第一个帖子是带有smalles序列号的帖子。但是,这也是该关系的默认顺序(请参见模型) 现在,当我将排序顺序更改为desc时,它应该返回序列号最高的post。但是,我得到的结果与上面相同Php Laravel-orderBy不处理关系集合,php,laravel,eloquent,Php,Laravel,Eloquent,最近,我将一个Laravel网站移动到另一台具有相同设置的服务器上(php、mariadb等的版本稍有不同),遇到了一个有趣的问题 我正在使用这个包(以前是riari/laravel论坛)来提供留言板功能。在论坛中,每个帖子都有一个链接,可以链接到最新的帖子,在移动之前效果很好。移动后,这些链接将指向最旧/第一篇帖子 该功能是的一部分,特别是函数getLastPostAttribute() 当我试图弄清这一点时,我意识到posts关系中的orderBy根本没有任何影响。无论我按什么属性排序(例如
$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,
}
这是按顺序desc排序时应返回的post:
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,
}
以前有人经历过吗?在移动之后,其他一切都正常工作,我不知道是什么导致了这样一个特定的错误。当您查看的源代码中的关系定义时,您会看到,
帖子在默认情况下已经由创建的排序:
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就可以工作了。两者的sequence
都等于1,因此没有顺序。参考id
似乎是同一个条目,这正是问题所在-两次返回的帖子都是同一个,这就是为什么序列是相同的。但还有1810个其他条目具有不同的序列号。因此,使用sequence DESC排序的调用应该返回序列为1811的调用。您可以编辑您的问题并添加应该是正确结果的帖子吗?sequence是posts
表中的一列还是访问者?你能发布线程
模型吗?(特别是posts()
关系定义)、Post
模型和posts
表迁移?此外,您能否确认正在使用$t->posts()->orderBy('sequence','desc')->toSql()运行查询?如果直接在数据库中运行查询,您会得到所需的结果吗?是的,这看起来很有希望,这要归功于上面提到的->toSql()函数。奇怪的是,同样的代码在旧服务器上运行良好。现在我将快速尝试一下。是的,覆盖这个函数为我解决了这个问题。奇怪的是,这个软件包以前工作得很好。。我会让软件包负责人知道,以防其他人遇到这种情况。谢谢不客气!查看下表,默认订单似乎是在2月份添加的。
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;
}