繁体   English   中英

Laravel - orderBy 不处理关系集合

[英]Laravel - orderBy not working on relationship collection

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

我正在使用 package Team-Tea-Time/laravel-forum (以前的 riari/laravel-forum)来提供留言板功能。 在论坛中,每个线程都有一个指向最新帖子的链接,在移动之前它运行良好。 移动后,这些链接将指向最旧/第一个帖子。

该功能是线程 model的一部分,特别是 function getLastPostAttribute()。

当试图深入了解这一点时,我意识到 post 关系上的 orderBy 根本没有任何效果。 无论我按什么属性排序(例如 created_at、sequence)和我请求的排序方向,它总是相同的发布顺序和相同的第一个帖子被返回。

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

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

$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 时,它应该返回具有最高序列号的帖子。 但相反,我得到了与上面相同的结果。

$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排序时应该返回的帖子:

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

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

当您查看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 将起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM