使用Eloquent对数据进行排序

24 浏览
0 Comments

使用Eloquent对数据进行排序

我是laravel的新手(从CI切换过来),对于eloquent ORM在某些方面仍然有些困惑!\n这是我的问题:\n我想使用Eloquent从我的数据库中对数据进行排序。\n我有一个表posts和一个表comments(每个post有很多comments,而每个comment属于posts)\n每个comment都有一个时间戳(=> created_at字段),我想按照以下方式排序:\n(我们在个人资料页面,所以$user->id是用户的id(显而易见))\n我想要从posts表中获取该用户发表过评论的每个post,并按照评论的created_at字段对所有这些post进行排序。\n我真的想要充分使用Eloquent,或者至少使用Fluent,但我不知道正确的方法。\n希望我表达清楚了,谢谢你的时间!

0
0 Comments

在Laravel中,使用Eloquent对数据进行排序可能会遇到问题。如果需要按照评论的创建时间对帖子进行排序,可以尝试以下代码:

$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](https://stackoverflow.com/questions/14299945)

然而,上述方法可能无法解决问题。原因在于查询并没有筛选帖子,而是评论。结果是,返回了所有帖子,但并没有进行排序。为什么在Laravel中如此简单的操作会变得困难呢?我尝试使用Fluent,但不得不承认我不喜欢它。你有其他的想法吗?

0
0 Comments

在使用Eloquent进行一对多关系的数据排序时,我曾经遇到过类似的问题。参考了这个帖子,我最终使用了join操作来解决。我的代码如下所示:

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

这段代码中,我通过在Posts模型和comments表之间进行了join操作,然后使用order_by函数对comments表中的created_at字段进行排序。最后,通过get函数获取排序后的数据,并且只选择了comments表中的field1字段和posts表中的field2字段。

这样,我就成功解决了使用Eloquent对一对多关系的数据进行排序的问题。通过使用join操作和order_by函数,我能够按照comments表中的created_at字段对数据进行正确的排序。

0
0 Comments

在我正在开发的一个项目中,我遇到了同样的问题。无论我到哪里看,都建议使用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;
    }
    ...
}

这段代码是对评论还是对帖子进行排序?

解决方案似乎已经过时了。不知道他们什么时候实际上实现了这个功能,但是你可以使用查询函数扩展关联关系。所以在这种情况下,你可以直接写return $this->hasMany('Comment')->orderBy('created_at', 'desc')

0