使用Eloquent对数据进行排序

问题描述:

我是laravel(从CI转换而来)的新手,而雄辩的ORM在某些时候仍然有点神秘!使用Eloquent对数据进行排序

这里是我的问题:

我想用雄辩的从我的DB数据进行排序。

我有一个表帖子和一张桌子评论(后有很多的意见和评论属于帖)

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

(我们PROFIL页,以便用户在$> id是用户(的ID很明显))

我想从这个地方用户做出的评论和帖子秩序每一个岗位所有那些由created_发布的在评论领域

我真的很想充分使用雄辩,或至少流利,而我不知道正确的方式这样做。

我希望我很清楚,并感谢您的时间!

我刚刚遇到了同样的问题,我正在开发一个项目。在我看来,我看到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; 
    } 
    ... 
} 
+0

这样排序的评论或帖子? – 2014-02-03 18:22:53

+0

它看起来像它整理评论... – 2014-02-08 22:28:31

+2

解决方案似乎已经过时。不知道他们什么时候实现了这个功能,但是可以扩展与查询功能的关系。所以在这种情况下,你可以写 'return $ this-> hasMany('Comment') - > orderBy('created_at','desc')'。 [credt](http://*.com/questions/18143061/laravel-orderby-on-a-relationship) – mwallisch 2015-04-07 00:43:36

像这样的东西可能会有所帮助。

$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

+0

感谢您的时间,但这不起作用:这是因为查询不会过滤帖子,而是评论。结果是,我得到了我所有的帖子,而且没有整理出来。 拉拉维尔怎么会这么简单的动作很难?我试过使用Fluent,但我不得不承认我讨厌它......你有另一个想法吗? – 2013-03-21 16:49:18

你所面临的问题是,因为你已经定义的关系仅仅是给你的是与相关的评论帖子和一个“Order By”的结果只是对评论进行排序,因为评论是即将发布的,所以你可以做的就是在评论模型中定义“评论”属于“发布”,然后找到哪些发表评论与之相关联,然后使用usort()函数运行手动比较一个例子(我在Laravel 3中编写代码,但您可以将它重写为任何其他版本):

因此,假设您的评论表有一个外键,名为postID它定义了与该帖子表和时间戳的帖子表是默认created_at和用户表连接到评论表的外键用户ID

$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类中包含这个函数,以便在项目中普遍使用这个函数。

我以前有同样的问题,但它是一对一的关系。这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')); 

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

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