按created_at排序Eloquent Collection

时间:2013-12-28 20:08:13

标签: php collections laravel laravel-4 eloquent

我有一个名为'posts'的表,其中包含以下列:'post_id int primary increment','poster_id int'和'status text'以及名为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”列对整个帖子集合进行排序。我还需要能够轻松地对整个集合进行分页。

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

3 个答案:

答案 0 :(得分:41)

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

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

您也可以在collection

上应用回调函数
$sorted = $posts->sortBy(function($post)
{
  return $post->created_at;
});

希望这会有所帮助。有关collections的详细信息,请阅读docs

答案 1 :(得分:3)

您不需要遍历<cfdump var="#deserializeJson(res.filecontent)#"> 数组,您可以像whereIn一样使用它

$friends

这将取代空集合创建和$posts = \Post::whereIn('poster_id', $friends)->latest()->get(); - 循环,并在按foreach排序的一个集合中为您提供所有朋友帖子

created_at函数是latest)的快捷方式

答案 2 :(得分:0)

在 Laravel 8 中可以像这样实现分页排序:

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