我是laravel的新手(从CI换掉),雄辩的ORM在某些方面仍然有点神秘!
这是我的问题:
我想使用Eloquent从我的数据库中对数据进行排序。
我有一个表帖子和一个表评论(帖子有很多评论和评论属于帖子)
每个评论都有一个时间戳(=> created_at字段),我想订购如下内容:
(我们在个人资料页面上,所以$ user-> id是用户的ID(显然))
我希望此用户发帖的帖子中的每封帖子,并按评论的created_at字段排序所有这些帖子
我真的想完全使用Eloquent,或者至少是流利的,我不知道这样做的正确方法。
我希望我很清楚,谢谢你的时间!
答案 0 :(得分:18)
我刚刚在我正在开发的项目中遇到了同样的问题。我看到的每个地方都看到了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;
}
...
}
答案 1 :(得分:3)
之前我遇到过同样的问题,但这是一对一的关系。这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'));
答案 2 :(得分:2)
这样的事情可能有所帮助。
$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
答案 3 :(得分:1)
如果您在用户类中定义了关系,那么您可以通过评论获取所有帖子。它返回一个Collection,它提供sortBy()和sortByDesc()函数。这两个函数都将接受回调,您可以自己选择排序方法。
$posts = $user->comments->post->sortByDesc(function($post) {
return $post->created_at;
});
答案 4 :(得分: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中,因为它是一个框架,并且执行特定功能的函数通常不包含在框架中,因为使用范围有限,据说你也可以在默认的DB类中包含此函数,以便在项目中普遍使用此功能。