使用Eloquent对数据进行排序
使用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希望我表达清楚了,谢谢你的时间!
在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,但不得不承认我不喜欢它。你有其他的想法吗?
在使用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字段对数据进行正确的排序。
在我正在开发的一个项目中,我遇到了同样的问题。无论我到哪里看,都建议使用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')
。