仅获得评论为最新的帖子,并获得5点以上的声誉

时间:2018-07-07 23:31:53

标签: php laravel laravel-5 laravel-5.5 laravel-5.6

我有$ posts集合实例,我不会只获得具有评论的帖子,而最新的一个评论则有5个以上的声誉。我的收藏实例与此类似

<<

我的代码是

[
    [
        'id' => 1,
        'title' => 'Some title',
        'comments' => [
            [
                'id' => 1,
                'content' => 'some content',
                'reputation' => 5
            ],
            [
                'id' => 2,
                'content' => 'some content',
                'reputation' => 6
            ],
            ...
        ],
    ],
    ...
]

但是我认为还有更多好的解决方案。

3 个答案:

答案 0 :(得分:1)

我不确定您要去这里做什么,但是也许这对您有用吗?

bellow将检索评论至少为1且声誉为5或更高的帖子,并且其降序排列。

$posts = Post::whereHas('comments')->with(['comments'=>function($q){
    $q->where('reputation', '>', 4); 
    $q->orderBy('id', 'desc');
}])->get();

注意:您必须在commments模型中初始化Post的关系

例如:

class Post extends Model
{
    /**
     * Get the comments for the blog post.
     */
    public function comments()
    {
        return $this->hasMany('App\Comment');
    }
}

答案 1 :(得分:0)

我在这里找到了更好的解决方案代码

$posts = $posts->filter(function ($post, $key) {
    $comments = collect($post['comments']);
    return $comments->pluck('reputation')->max() > 5;
});

答案 2 :(得分:0)

如果您想评论信誉超过5的评论,那么@Jesus Erwin Suarez的答案是正确的。

但是,如果您想在其他字段中查看该帖子的评论的声誉是否超过5,则可以使用该方法:

// this will add an extra column `has_reputed_comments` in rows
$posts = Post::selectRaw('*, IF(EXISTS(SELECT * FROM comments where comments.post_id = posts.id AND comments.reputation > 5 ORDER BY id DESC), 1, 0) as has_reputed_comments')->get();

已更新

要过滤评论中提到的集合,您可以执行以下操作:

// this will return filtered result by reputation greater than 5
$comments = $posts->comments->where('reputation', '>', 5);