Как отсортировать данные в laravel 7 eloquent с помощью карты сбора?

#laravel #eloquent #eloquent-relationship

#laravel #eloquent #eloquent-взаимосвязь

Вопрос:

У меня есть этот код для получения комментариев и ответов. Я хотел бы знать, как я могу отсортировать ответы:

 $comments = Comment::where([
            ['commentable_type', 'AppModelsPostsPost'],
            ['commentable_id', $post->id],
            ['parent_id', null]
])->with('replies')
          ->orderBy('created_at', 'desc')
          ->take(10)
          ->get()->map(function($comments) {
                $comments->setRelation('replies', $comments->replies->take(3));                
                return $comments;
});
 

Я попытался сделать это:

 $comments = Comment::where([
            ['commentable_type', 'AppModelsPostsPost'],
            ['commentable_id', $post->id],
            ['parent_id', null]
])->with('replies')
          ->orderBy('created_at', 'desc')
          ->take(10)
          ->get()->map(function($comments) {
                $comments->setRelation('replies', $comments->replies->take(3));                                    
                $comments->setRelation('replies', $comments->replies)->orderBy('created_at', 'desc');
                return $comments;
});
 

А также

 $comments = Comment::where([
            ['commentable_type', 'AppModelsPostsPost'],
            ['commentable_id', $post->id],
            ['parent_id', null]
])->with('replies')
          ->orderBy('created_at', 'desc')
          ->take(10)
          ->get()->map(function($comments) {
                $comments->setRelation('replies', $comments->replies->take(3)->orderBy('created_at', 'desc'));
                return $comments;
});
 

Но не работает.

Не могли бы вы мне помочь?

С уважением

Ответ №1:

Предполагая, что вам нужны последние три ответа для каждого комментария — это должно сработать

 $comments = Comment::where([
        ['commentable_type', 'AppModelsPostsPost'],
        ['commentable_id', $post->id],
        ['parent_id', null]
    ])->with(['replies' => function($query){
        $query->latest();
    }])
    ->get()
    ->map(function($comment) {
        $replies = $comment->replies;

        unset($comment->replies);

        $comment->setRelation('replies', $replies->take(3));
        
        return $comment;
    });
 

Комментарии:

1. Привет, tks, но не работает, потому что этот код ограничивает 3 ответа на все комментарии. Мне нужно, чтобы он ограничивал 3 ответа на каждый комментарий. Мой код работает, но я не знаю, как сортировать результаты для ответов.

2. Предоставленный код выведет 3 ответа на каждый комментарий, отсортированные в порядке убывания, начиная с последнего — это то, что, как я думал, вы хотите. Я все еще не могу понять, каковы ваши точные требования

3. Вы все правильно поняли. Но этот код работает не так, как вы говорите. Этот код возвращает: Комментарий 1 Ответ 1 комментарий 2 Ответ 2 Комментарий 3 Ответ 3 Я хочу Комментарий 1 Ответ 1 Ответ 2 Ответ 3 Комментарий 2 Ответ 1 Ответ 2 Ответ 3 Комментарий 3 Ответ 1 Ответ 2 Ответ 3 Комментарий 4 Ответ 1 Ответ 2 Ответ 3 Комментарий 5 Ответ 1 Ответ 2 Ответ 3

4. @Jader обновил ответ — попробуйте и дайте мне знать, что это работает в соответствии с вашими требованиями

5. Привет, это новое решение работает нормально. Большое вам спасибо!