使用Eloquent对数据进行排序

时间:2013-03-20 20:08:40

标签: sorting laravel

我是laravel的新手(从CI换掉),雄辩的ORM在某些方面仍然有点神秘!

这是我的问题:

我想使用Eloquent从我的数据库中对数据进行排序。

我有一个表帖子和一个表评论(帖子有很多评论和评论属于帖子)

每个评论都有一个时间戳(=> created_at字段),我想订购如下内容:

(我们在个人资料页面上,所以$ user-> id是用户的ID(显然))

我希望此用户发帖的帖子中的每封帖子,并按评论的created_at字段排序所有这些帖子

我真的想完全使用Eloquent,或者至少是流利的,我不知道这样做的正确方法。

我希望我很清楚,谢谢你的时间!

5 个答案:

答案 0 :(得分:18)

我刚刚在我正在开发的项目中遇到了同样的问题。我看到的每个地方都看到了usort()uasort()作为解决此问题的建议方法。 (Collection::sort()只是uasort()的包装器,但是这并不能让我满意,因为为什么我会使用PHP来排序SQL应该为我做一个ORDER BY子句?我最终使用getXXXAttribute()方法以这种方式实现它:

class Post extends Eloquent {
    public function comments()
    {
        return $this->hasMany('Comment');
    }

    public function getCommentsAttribute()
    {
        $comments = $this->comments()->getQuery()->orderBy('created_at', 'desc')->get();
        return $comments;
    }
    ...
}

答案 1 :(得分:3)

之前我遇到过同样的问题,但这是一对一的关系。这post对我有所帮助。我最终使用了一个联接。我的代码是这样的:

$data = Posts::join('comments', 'comments.post_id', '=', 'posts.id')
        ->order_by('comments.created_at')
        ->get(array('comments.field1 as field1', 'posts.field2 as field2'));

答案 2 :(得分:2)

这样的事情可能有所帮助。

$content = Posts::with(array('comments' => function($query) {
               $query->order_by('created_at', 'asc');
            }))
            ->get();

或者如果您的问题更复杂:

How to sort by a field of the pivot table of a many-to-many relationship in Eloquent ORM

答案 3 :(得分:1)

如果您在用户类中定义了关系,那么您可以通过评论获取所有帖子。它返回一个Collection,它提供sortBy()和sortByDesc()函数。这两个函数都将接受回调,您可以自己选择排序方法。

$posts = $user->comments->post->sortByDesc(function($post) {
    return $post->created_at;
});

答案 4 :(得分:0)

您面临的问题是因为您定义的关系只是为您提供与帖子关联的评论,并且该结果的“排序依据”将仅对评论进行排序,因为评论是什么出来,所以你可以做的是在评论模型中定义“评论”属于“发布”,然后找到与评论关联的帖子,然后使用usort()函数运行手动比较一个例子是(我在Laravel 3中编写代码但你可以为任何其他版本重写它):

因此,假设您的Comments表有一个名为 postID 的外键,它定义了与Posts表的关系,Posts表中的Timestamp是默认的 created_at 和Users表使用外键 userid

连接到Comments表
    $userid = $user->id;
    $comments = Comments::where_userid($userid);
    function commentsort($first, $second){
      if (getCommentPost($first) == getCommentPost($second)) {
        return 0;
      }
     return (getCommentPost($first) < getCommentPost($second)) ? -1 : 1;
    }

    function getCommentPost($comment){
    return Post::where_postid($comment->postid)->first()->created_at;
    }

    usort($comments, "commentsort");

这应该有助于解决这个问题,实际上这不包含在Laravel中,因为它是一个框架,并且执行特定功能的函数通常不包含在框架中,因为使用范围有限,据说你也可以在默认的DB类中包含此函数,以便在项目中普遍使用此功能。