Вы можете достичь этого, используя модель отношений (само), к примеру, предположим, что это ваш comments
таблица:
id (PK) | content | post_id | user_id | comment_parent
------------------------------------------------------
1 | Hello | 1 | 1 | 0 <-- This is a parent because of 0
2 | Hi | 1 | 2 | 1 <-- child of 1
3 | Howdy | 1 | 3 | 1 <-- child of 1
Читайте эту таблицу: есть всего три комментария, первый комментарий производится User
с user_id-1
и у него есть два ребенок замечания, сделанные два других пользователей, чьи id
«s являются user_id-2
и user_id-3
.
Здесь колонка comment_parent
поддерживает отношения между parent
и child
комментариями. comment_parent
со значением 0
является родительским комментарием и кроме 0
, например, здесь два комментария имеют comment_parent
из 1
, что означает, что эти два комментария являются дочерними элементами комментария, id/PK
- 1
.
Итак, теперь, в вашей Comment
модели объявить эти методы:
// Get only children of a comment
public function children()
{
return $this->hasMany('Comment', 'comment_parent');
}
// Get the user of comment
public function user()
{
return $this->belongsTo('User', 'user_id');
}
// Get the post of comment
public function post()
{
return $this->belongsTo('Post', 'post_id');
}
Затем в Post
модели объявить этот метод:
// Only parent comments
public function comments()
{
return $this->hasMany('Comment', 'post_id')->where('comment_parent', 0);
}
// All Comments
public function allComments()
{
return $this->hasMany('Comment', 'post_id');
}
Теперь, если вы делаете что-то вроде этого:
$post = Post::with('comments.children')->find(1);
Тогда вы можете попробовать что-то подобное на ваш взгляд (возможно в вашем post.single.blade.php
):
{{ $post->title }}
{{ $post->body }}
<!-- Comment Template For Posting New Comments-->
@if($post->comments->count())
@foreach($post->comments as $comment)
{{ $comment->user->username }}
{{ $comment->body }}
@if($comment->children->count())
@foreach($comment->children as $childComment)
{{ $childComment->user->username }}
{{ $childComment->body }}
@endforeach
@endif
@endforeach
@endif
Это идея, и в этом случае ваши комментарии будут иметь 0
как comment_parent
по умолчанию, и если комментарий является ответом на другой комментарий, то установить его comment_parent
на это родитель id
. Кроме того, вы можете проверить this article на другой подход.
Поскольку это древовидная структура, это немного сложно, потому что вы можете получить несколько (в теории бесконечных) запросов, но самым простым способом будет просто рекурсивно загружать комментарии с детьми. –