【问题标题】:Sorting data with Eloquent使用 Eloquent 对数据进行排序
【发布时间】:2013-03-20 20:08:39
【问题描述】:

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

这是我的问题:

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

我有一个表posts和一个表cmets(post有很多cmets,comment属于posts)

每条评论都有一个时间戳(=> created_at 字段),我想按以下顺序排列:

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

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

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

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

【问题讨论】:

    标签: sorting laravel


    【解决方案1】:

    我刚刚在我正在开发的项目中遇到了同样的问题。我到处都看到usort()uasort() 作为解决此问题的建议方法。 (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;
        }
        ...
    }
    

    【讨论】:

    • 这是对 cme​​ts 还是帖子进行排序?
    • 该解决方案似乎已过时。不知道他们何时真正实现了这一点,但您可以使用查询函数扩展关系。所以在这种情况下,你可以写 return $this->hasMany('Comment')->orderBy('created_at', 'desc')credt
    • Collection::sort() 的链接已损坏。
    【解决方案2】:

    我之前也遇到过同样的问题,但这是一对一的关系。这个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'));
    

    【讨论】:

      【解决方案3】:

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

      $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

      【讨论】:

      • 感谢您的宝贵时间,但这不起作用:这是因为查询不会过滤帖子而是过滤评论。结果是,我得到了所有的帖子,但没有整理出来。这么简单的动作在 laravel 怎么这么难?我尝试使用 Fluent,但我不得不承认我讨厌它……你还有其他想法吗?
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        您面临的问题是因为您定义的关系只是为您提供与帖子相关联的评论,并且对该结果的“排序依据”只会对 cme​​ts 进行排序,因为 cmets 是出来了,所以你可以做的是在评论模型中定义“评论”属于“帖子”,然后找到评论与哪个帖子相关联,然后使用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 类中包含这个功能,以便在项目中普遍使用这个功能。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-03-27
          • 2017-05-18
          • 2015-05-25
          • 2022-01-07
          • 1970-01-01
          • 1970-01-01
          • 2017-12-10
          • 2016-01-04
          相关资源
          最近更新 更多