Home > PHP Framework > Laravel > Laravel5 implements the form of nested comments (detailed code explanation)

Laravel5 implements the form of nested comments (detailed code explanation)

不言
Release: 2018-12-21 09:52:14
forward
3510 people have browsed it

The content of this article is about the form of implementing nested comments in Laravel5 (detailed code explanation). It has certain reference value. Friends in need can refer to it. I hope it will be helpful to you.

We often see comments displayed in many forms, such as '@' so-and-so, or contracted comments like Zhihu, or nested comments, so at the beginning it is also The most common one is nested comments, because this is more eye-catching.

Preparation work

1. Design three tables: users, posts, comments, table The structure is as follows:

users

Schema::create('users', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->string('email')->unique();
    $table->string('password');
    $table->rememberToken();
    $table->timestamps();
});
Copy after login

posts

Schema::create('posts', function (Blueprint $table) {
    $table->increments('id');
    $table->string('title');
    $table->integer('user_id')->index();
    $table->text('content');
    $table->timestamps();
});
Copy after login

comments

Schema::create('comments', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('user_id')->index();
    $table->integer('post_id')->index();
    $table->integer('parent_id')->index()->default(0);
    $table->text('body');
    $table->timestamps();
});
Copy after login

2.Model layer:
Post.php file

/**
 * 一篇文章有多个评论
 * @return \Illuminate\Database\Eloquent\Relations\HasMany
 */
public function comments()
{
    return $this->hasMany(Comment::class);
}

/**
 * 获取这篇文章的评论以parent_id来分组
 * @return static
 */
public function getComments()
{
    return $this->comments()->with('owner')->get()->groupBy('parent_id');
}
Copy after login

Comments.php file

/**
 * 这个评论的所属用户
 * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
 */
public function owner()
{
    return $this->belongsTo(User::class, 'user_id');
}

/**
 * 这个评论的子评论
 * @return \Illuminate\Database\Eloquent\Relations\HasMany
 */
public function replies()
{
    return $this->hasMany(Comment::class, 'parent_id');
}
Copy after login

Logic writing
The nested comments we want to implement actually already have some ideas in our preparation work. We first display an article. , and use the one-to-many relationship between articles and comments to display all comments. However, our comments involve a field called parent_id. This field is actually very special. We use this field to perform grouping. The code is the return above. $this->comments()->with('owner')->get()->groupBy('parent_id'), the specific process is as follows:

web.php file

\Auth::loginUsingId(1); //用户id为1的登录

//显示文章和相应的评论
Route::get('/post/show/{post}', function (\App\Post $post) {
    $post->load('comments.owner');
    $comments = $post->getComments();
    $comments['root'] = $comments[''];
    unset($comments['']);
    return view('posts.show', compact('post', 'comments'));
});

//用户进行评论
Route::post('post/{post}/comments', function (\App\Post $post) {
    $post->comments()->create([
        'body' => request('body'),
        'user_id' => \Auth::id(),
        'parent_id' => request('parent_id', null),
    ]);
    return back();
});
Copy after login

View code
We need to implement nesting in terms of views, so as users comment more and more on each other, there will be more levels of nesting, so, We need to use various tricks to display the entire comment here. We use the @include() function to display it. Then the structure of our attempt is as follows:

 - comments
comments.blade.php
form.blade.php
list.blade.php

 - posts
show.blade.php
Copy after login

The code is as follows:
show.blade.php

nbsp;html>


    <meta>
    <meta>
    <meta>
    <link>


<div>
    <div>
        <h2>{{$post->title}}</h2>
        <h4>{{$post->content}}</h4>
        <hr>
        @include('comments.list',['collections'=>$comments['root']])
        <h3>留下您的评论</h3>
        @include('comments.form',['parentId'=>$post->id])
    </div>
</div>

Copy after login

comment.blade.php

<div>
    <h5>
<span>{{$comment->owner->name}}</span>:</h5>
    <h5>{{$comment->body}}</h5>

    @include('comments.form',['parentId'=>$comment->id])

    @if(isset($comments[$comment->id]))
        @include('comments.list',['collections'=>$comments[$comment->id]])
    @endif
    <hr>
</div>
Copy after login

form.blade.php

Copy after login
id.'/comments')}}" accept-charset="UTF-8">     {{csrf_field()}}     @if(isset($parentId))              @endif     
                      
    

list.blade.php

@foreach($collections as $comment)
    @include('comments.comment',['comment'=>$comment])
@endforeach
Copy after login

The final rendering is as follows

Laravel5 implements the form of nested comments (detailed code explanation)

The above is the detailed content of Laravel5 implements the form of nested comments (detailed code explanation). For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:segmentfault.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template