Laravel 5:如何做多线程评论

Hal*_*nex 0 php laravel laravel-5

我正在使用Laravel Commentable包,它使用嵌套集模式和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
Run Code Online (Sandbox Code Playgroud)

我的模特(评论和用户)

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');
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是我提交评论的方式 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);
}
Run Code Online (Sandbox Code Playgroud)

这就是观点

    <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 -->
Run Code Online (Sandbox Code Playgroud)

who*_*boy 6

我没有使用Laravel Commentable包,但文档看起来很不错.

我相信你需要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);
Run Code Online (Sandbox Code Playgroud)

要对评论发表评论,看起来你做的是这样的.我可能会做一个CommentsController.

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);
}
Run Code Online (Sandbox Code Playgroud)

关系,根和叶范围,访问祖先/ descendancy链的文档的部分就如何然后检索征求意见的评论的几个例子.

编辑

看起来包中的Comment模型已经扩展了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>
Run Code Online (Sandbox Code Playgroud)