Получить только сообщения с последним одним комментарием, который имеет более 5 репутации

У меня есть $ [ [ 'id' => 1 , 'title' => 'Some title' , 'comments' => [ [ 'id' => 1 , 'content' => 'некоторый контент' , 'репутация' = > 5 ], [ 'id' => 2 , 'content' => 'некоторый контент' , 'репутация' => 6 ], ... ], ], ... ] и я не буду получать только те сообщения, у которых есть комментарии и последние комментарии имеют более 5 репутации. Мой экземпляр коллекции аналогичен этому

$posts = $posts->filter(function ($post, $key) {
    $isHasMoreFiveComments = false;
    foreach ($post['comments'] as $comment) {
        if ($comment['reputation'] > 5) {
            $isHasMoreFiveComments = true;
            break;
        }
    }
    return $isHasMoreFiveComments;
});

Мой код

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

но я думаю, что есть более хорошее решение.

php,laravel,laravel-5,laravel-5.5,laravel-5.6,

-1

Ответов: 3


1

Я не уверен, что вы пытаетесь получить здесь, но, вероятно, это сработает для вас?

bellow будет извлекать сообщения, у которых есть хотя бы 1 комментарий с репутацией 5 и выше, также он находится в порядке убывания.

commments

Примечание: вы должны инициализировать отношения Postв вашей Postмодели

например:

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

0 принят

Я нашел более хорошее решение здесь код

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

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);
php, laravel, laravel-5, laravel-5.5, laravel-5.6,
Похожие вопросы