按created_at排序Eloquent Collection

Lia*_*ter 22 php collections laravel eloquent laravel-4

我有一个名为'posts'的表,其中包含以下列:'post_id int primary incrementments','poster_id int'和'status text'以及名为friends的数组,其中包含以下列:'user_id int primary'和'friend_ids text'.

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

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

文本列中的数据看起来像'1,2,3'等.

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

$posts = new \Illuminate\Database\Eloquent\Collection();
Run Code Online (Sandbox Code Playgroud)

但问题是我无法弄清楚如何填充集合并通过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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚这个代码是否适用于通过'created_at'列对整个帖子集合进行排序.我还需要能够轻松地对整个集合进行分页.

对集合进行排序的推荐方法是什么?

Alt*_*rim 47

如果要对a进行排序collection,可以使用sortBy给定键的方法

$sorted = $posts->sortBy('created_at');
Run Code Online (Sandbox Code Playgroud)

你也可以在上面应用回调函数 collection

$sorted = $posts->sortBy(function($post)
{
  return $post->created_at;
});
Run Code Online (Sandbox Code Playgroud)

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

  • 或者使用sortByDesc() (11认同)

Arv*_*vid 7

您不需要遍历$friends数组,您可以像这样将它与whereIn一起使用

$posts = \Post::whereIn('poster_id', $friends)->latest()->get();
Run Code Online (Sandbox Code Playgroud)

这取代了空集合创建和 -foreach循环,并为您提供一个集合中的所有朋友帖子,按以下顺序排序created_at

(该latest函数是 的快捷方式orderBy('created_at', 'desc')