Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel-orderBy不处理关系集合_Php_Laravel_Eloquent - Fatal编程技术网

Php Laravel-orderBy不处理关系集合

Php Laravel-orderBy不处理关系集合,php,laravel,eloquent,Php,Laravel,Eloquent,最近,我将一个Laravel网站移动到另一台具有相同设置的服务器上(php、mariadb等的版本稍有不同),遇到了一个有趣的问题 我正在使用这个包(以前是riari/laravel论坛)来提供留言板功能。在论坛中,每个帖子都有一个链接,可以链接到最新的帖子,在移动之前效果很好。移动后,这些链接将指向最旧/第一篇帖子 该功能是的一部分,特别是函数getLastPostAttribute() 当我试图弄清这一点时,我意识到posts关系中的orderBy根本没有任何影响。无论我按什么属性排序(例如

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

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

该功能是的一部分,特别是函数getLastPostAttribute()

当我试图弄清这一点时,我意识到posts关系中的orderBy根本没有任何影响。无论我按什么属性排序(例如创建的、顺序)和我请求的排序方向,它始终是相同的后序和返回的相同的第一个后序

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

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

现在,当我将排序顺序更改为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,
}
这是按顺序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;
}