按created_at对雄辩的合集进行排序

2022-08-30 14:46:10

我有一个名为“posts”的表格,其中包含列:“post_id int主要增量”,“poster_id int”和“状态文本”,以及一个名为friends的数组,其中包含列:“user_id int primary”和“friend_ids文本”。

我需要获取朋友文本列中的所有ID,这很容易使用:

$friends = explode(',', \Friend::where('user_id', \Sentry::getUser()->id)->first()->friend_ids);

其中,文本列中的数据将看起来像“1,2,3”等。

然后,我创建了一个 Eloquent Collection 对象,该对象也可以通过以下方式轻松完成:

$posts = new \Illuminate\Database\Eloquent\Collection();

但问题是我无法弄清楚如何填充集合并按Post对象的“created_at”列对其内容进行排序。

这就是我目前所拥有的:

foreach ($friends as $id) {
    $posts_ = \Post::where('poster_id', $id)->getQuery()
        ->orderBy('created_at', 'desc')
        ->get();
    foreach($posts_ as $post) {
        $posts->add($post);
    }
}

我无法确定此代码是否适用于按“created_at”列对整个帖子集合进行排序。我还需要能够轻松地对整个集合进行分页。

建议的对集合进行排序的方法是什么?


答案 1

如果要对进行排序,则可以按给定键使用该方法collectionsortBy

$sorted = $posts->sortBy('created_at');

您也可以在collection

$sorted = $posts->sortBy(function($post)
{
  return $post->created_at;
});

希望这有帮助。有关您可以阅读文档的更多信息collections


答案 2

您不需要遍历数组,只需将其与 whereIn 一起使用即可,如下所示$friends

$posts = \Post::whereIn('poster_id', $friends)->latest()->get();

这取代了空的集合创建和 -loop,并在一个集合中为您提供所有朋友的帖子排序foreachcreated_at

最新函数是 orderBy('created_at', 'desc')的快捷方式)


推荐