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

Davit спросил: 13 июня 2018 в 09:51 в: php

У меня есть экземпляр экземпляров сообщений, и я не хочу получать только те сообщения, у которых есть комментарии и последние комментарии имеют более 5 репутации , Мой экземпляр коллекции похож на этот

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

Мой код

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

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


3 ответа

Jesus Erwin Suarez ответил: 13 июня 2018 в 10:09

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

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

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

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

ex:

Jesus Erwin Suarez ответил: 13 июня 2018 в 10:12
Хорошо, возможно, вы также сможете опубликовать свой фильтр.
Davit ответил: 13 июня 2018 в 10:11
Спасибо за ответ. Но мне нужно получить все сообщения и после этого фильтровать только мои сообщения условий
Есть решение
Davit ответил: 13 июня 2018 в 04:12

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

$posts = $posts->filter(function ($post, $key) {
    $comments = collect($post['comments']);
    return $comments->pluck('reputation')->max() > 5;
});
Aakash Tushar ответил: 14 июня 2018 в 06:09

Если вам нужны комментарии с репутацией более 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);
Aakash Tushar ответил: 14 июня 2018 в 06:04
Это всегда плохая практика, чтобы получить все сразу, однако я обновлю свой ответ.
Aakash Tushar ответил: 14 июня 2018 в 06:11
Повторите мой ответ, я обновил его

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

Formation Laravel 5 - 20 - Les collections

how to install laravel - laravel 5.5 tutorial - part02

Formation Laravel 5 - 53 - Les messages Flash