【问题标题】:Sort Eloquent Collection by created_at按 created_at 排序 Eloquent 集合
【发布时间】: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”列对整个帖子集合进行排序。我还需要能够轻松地对整个集合进行分页。

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

【问题讨论】:

    标签: php collections laravel laravel-4 eloquent


    【解决方案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');
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-29
        • 2020-01-04
        • 1970-01-01
        • 1970-01-01
        • 2011-04-05
        • 2015-09-18
        • 2019-05-26
        相关资源
        最近更新 更多