12

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

这是我的问题:

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

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

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

(我们在配置文件页面上,所以 $user->id 是用户的 id(显然))

我想要该用户发表评论的帖子中的每篇帖子,并按评论的 created_at 字段对所有这些帖子进行排序

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

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

4

5 回答 5

19

我刚刚在我正在开发的项目中遇到了同样的问题。在我所见的任何地方,我都看到了usort()oruasort()作为解决此问题的建议方法。(Collection::sort() 只是一个包装器uasort())但这并没有让我满意,因为当 SQL 应该使用 ORDER BY 子句为我进行排序时,我为什么要使用 PHP 进行排序?我最终使用 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;
    }
    ...
}
于 2013-10-10T00:10:36.950 回答
3

我之前也遇到过同样的问题,但这是一对一的关系。这篇文章帮助了我。我最终使用了一个连接。我的代码是这样的:

$data = Posts::join('comments', 'comments.post_id', '=', 'posts.id')
        ->order_by('comments.created_at')
        ->get(array('comments.field1 as field1', 'posts.field2 as field2'));
于 2013-07-30T08:55:38.553 回答
2

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

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

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

如何在 Eloquent ORM 中按多对多关系的数据透视表的字段进行排序

于 2013-03-21T08:37:01.237 回答
1

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

$posts = $user->comments->post->sortByDesc(function($post) {
    return $post->created_at;
});
于 2015-11-11T17:11:13.923 回答
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 中,因为它是一个框架,并且执行特定功能的这些功能通常不包含在框架中,因为使用范围有限,据说你也可以包括默认数据库类中的这个函数,以便在项目中普遍使用这个功能。

于 2013-03-25T18:35:16.793 回答