按 created_at 排序 Eloquent 集合

Posted

技术标签:

【中文标题】按 created_at 排序 Eloquent 集合【英文标题】:Sort Eloquent Collection by created_at 【发布时间】:2014-01-16 02:49:44 【问题描述】:

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

推荐的收藏排序方式是什么?

【问题讨论】:

【参考方案1】:

如果您想对collection 进行排序,可以使用sortBy 方法按给定键

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

您还可以在collection 上应用回调函数

$sorted = $posts->sortBy(function($post)

  return $post->created_at;
);

希望这会有所帮助。有关collections 的更多信息,您可以阅读docs

【讨论】:

太棒了! ☺ 就我而言,我有更多维度,所以我将其调整为return $post->type->hierarchy;,并且成功了! 如何按多个字段排序? (我的意思是,当某个字段的值相同时,按其他条件排序) 由于某种原因,当我使用这个解决方案时,$post 作为集合本身传递,所以我需要调用 $post->first()->created_at;否则我会得到未定义的属性异常 @shock_gone_wild 它按 created_at 字符串排序,但比较仍然可以正常工作。如果你愿意,你也可以转换为 Unix 时间戳return strtotime($post->created_at); 感谢您的回答。只要格式为 Y-m-d ,它将起作用。但是,如果 created_at 的格式没有按 m.d.Y 等最重要的句点排序,则排序顺序将失败。但是使用 strtotime() 函数,它可以在任何情况下工作。【参考方案2】:

你不需要循环遍历$friends数组,你可以像这样和whereIn一起使用

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

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于按 created_at 排序 Eloquent 集合的主要内容,如果未能解决你的问题,请参考以下文章

Laravel按hasmany关系排序

Laravel Eloquent,按月/年分组

Eloquent 获取按日期分组的最后一条记录

如何使用 Laravel eloquent 选择所有 created_at

Mongoid Rails 4 按 asc 或 desc order created_at 排序

Mongodb 按日期排序