#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. Привет, это новое решение работает нормально. Большое вам спасибо!