Laravel 5: как делать многопоточные комментарии

Я использую пакет Laravel Commentable , который использует шаблон Nested Sets с Baum .

Мне удалось разрешить пользователям делать комментарии к сообщениям, но они не являются потоковыми, каждый комментарий имеет depth установленную в ноль в базе данных.

Поэтому мне интересно, как можно делать многопоточные комментарии, например reddit?

Это мои таблицы

 users: id, name, email... posts: id, user_id, subreddit_id... comments: id, body, parent_id, lft, rgt, depth, commentable_id, commentable_type, user_id 

Мои модели (комментарий и пользователь)

 class Comment extends Model { use Commentable; public function commentable() { return $this->morphTo(); } public function user() { return $this->belongsTo('App\User'); } public function posts() { return $this->belongsTo('App\Post'); } } class User extends Model implements AuthenticatableContract, AuthorizableContract, CanResetPasswordContract { use Authenticatable, Authorizable, CanResetPassword; public function posts() { return $this->hasMany('App\Post'); } public function comments() { return $this->hasMany('App\Comment'); } } 

Вот как я отправляю комментарии в PostsController

 public function createComment($id) { $post = Post::with('user.votes')->with('subreddit.moderators')->where('id', $id)->first(); $comment = new Comment; $comment->body = Input::get('comment'); $comment->user_id = Auth::id(); $post->comments()->save($comment); } 

И это мнение

  <div class="post-comments"> {!! Form::open(['route' => ['comment', $post]]) !!} <div class="form-group"> <label for="comment">Your Comment</label> <textarea name="comment" class="form-control" rows="3"></textarea> </div> <button type="submit" class="btn btn-default">Send</button> {!! Form::close() !!} <div class="comments-nav"> <ul class="nav nav-pills"> <li role="presentation" class="dropdown"> <a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false"> there are {{ count($comments) }} comments <span class="caret"></span> </a> <ul class="dropdown-menu"> <li><a href="#">Best</a></li> <li><a href="#">Hot</a></li> </ul> </li> </ul> </div> <div class="row"> <div class="media"> <!-- first comment --> @foreach($comments as $comment) <div class="media-heading"> <button class="btn btn-default btn-xs" type="button" data-toggle="collapse" data-target="#{{ $comment->id }}" aria-expanded="false" aria-controls="collapseExample"><span class="glyphicon glyphicon-minus" aria-hidden="true"></span></button> <span class="label label-info">12314</span> {{ $comment->user->name }} 12 hours ago </div> <div class="panel-collapse collapse in" id="{{ $comment->id }}"> <div class="media-left"> <div class="vote-wrap"> <div class="vote up"> <i class="glyphicon glyphicon-menu-up"></i> </div> <div class="vote inactive"> <i class="glyphicon glyphicon-menu-down"></i> </div> </div> <!-- vote-wrap --> </div> <!-- media-left --> <div class="media-body"> <p>{{ $comment->body }}</p> <div class="comment-meta"> <span><a href="#">delete</a></span> <span><a href="#">report</a></span> <span><a href="#">hide</a></span> <span> <a class="" role="button" data-toggle="collapse" href="#replyCommentT" aria-expanded="false" aria-controls="collapseExample">reply</a> </span> <div class="collapse" id="replyCommentT"> <form> <div class="form-group"> <label for="comment">Your Comment</label> <textarea name="comment" class="form-control" rows="3"></textarea> </div> <button type="submit" class="btn btn-default">Send</button> </form> </div> </div> <!-- comment-meta --> </div> </div> <!-- comments --> @endforeach </div> <!-- first comment --> </div> </div> <!-- post-comments --> 

Related of "Laravel 5: как делать многопоточные комментарии"

Я не использовал Laravel Commentable package, но документы выглядят неплохо.

Я считаю, что вам нужно use Commentable; на вашей модели Post а не на вашей модели Comment .

Похоже, ваша модель Comment должна расширять Baum\Node а не Model

Тогда то, что у вас есть, должно работать.

 $post = Post::with('user.votes')->with('subreddit.moderators')->where('id', $id)->first(); $comment = new Comment; $comment->body = Input::get('comment'); $comment->user_id = Auth::id(); $post->comments()->save($comment); // or you could do $comment->makeChildOf($post); 

Чтобы сделать комментарий к комментарию, похоже, что вы делаете что-то вроде этого. Я бы, вероятно, сделал commentController.

 public function addComment(Request $request){ $parent = Comment::find(Input::get('parent_id')); $comment = new Comment; $comment->body = Input::get('comment'); $comment->user_id = Auth::id(); $comment->makeChildOf($parent); } 

Области отношений , корня и листа , доступ к разделу цепочки предков / нисходящих цепочек документов содержит несколько примеров того, как затем извлекать комментарии для комментариев.

редактировать

Похоже, модель комментария в пакете уже расширяет Baum \ Node, поэтому вам не нужно это делать. Чтобы использовать этот пакет, похоже, вам нужно использовать его модель комментариев . Я уверен, что вы можете использовать его модель в качестве базы и бросить свой собственный.

Вы могли бы сделать что-то подобное. Вам нужно будет настроить маршрут.

 <div class="collapse" id="replyCommentT"> {!! Form::open(['route' => ['comment', $comment]]) !!} <input type="hidden" name="parent_id" value="{{ $comment->id }}"/> <div class="form-group"> <label for="comment">Your Comment</label> <textarea name="comment" class="form-control" rows="3"></textarea> </div> <button type="submit" class="btn btn-default">Send</button> {!! Form::close() !!} </div>