Heim > PHP-Framework > Laravel > Laravel5 implementiert die Form verschachtelter Kommentare (detaillierte Codeerklärung)

Laravel5 implementiert die Form verschachtelter Kommentare (detaillierte Codeerklärung)

不言
Freigeben: 2018-12-21 09:52:14
nach vorne
3531 Leute haben es durchsucht

Der Inhalt dieses Artikels befasst sich mit der Implementierung verschachtelter Kommentare in Laravel5 (detaillierte Code-Erklärung). Ich hoffe, dass er für Sie hilfreich ist.

Wir sehen oft, dass Kommentare in vielen Formen angezeigt werden, wie zum Beispiel „@“ so und so, oder verkürzte Kommentare wie Zhihu oder verschachtelte Kommentare, daher ist das erste, was am häufigsten vorkommt, verschachtelt Kommentare, weil sie auffälliger sind.

Vorbereitungsarbeit

1 Entwerfen Sie drei Tabellen: Benutzer, Beiträge, Kommentare, Tabelle folgt:

Benutzer

Schema::create('users', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->string('email')->unique();
    $table->string('password');
    $table->rememberToken();
    $table->timestamps();
});
Nach dem Login kopieren

Beiträge

Schema::create('posts', function (Blueprint $table) {
    $table->increments('id');
    $table->string('title');
    $table->integer('user_id')->index();
    $table->text('content');
    $table->timestamps();
});
Nach dem Login kopieren

Kommentare

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();
});
Nach dem Login kopieren

2. Modellebene:
Post.php-Datei

/**
 * 一篇文章有多个评论
 * @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');
}
Nach dem Login kopieren

Comments.php-Datei

/**
 * 这个评论的所属用户
 * @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');
}
Nach dem Login kopieren

Logisches Schreiben
Die verschachtelten Kommentare, die wir implementieren möchten, haben tatsächlich einige Ideen in unserer Vorbereitungsarbeit und verwenden diese -zu-viele-Beziehung zwischen Artikeln und Kommentaren, aber unsere Kommentare beinhalten ein Feld namens parent_id. Dieses Feld verwenden wir zum Gruppieren, und der Code ist der obige Rückgabewert. comments()->with('owner')->get()->groupBy('parent_id'), der spezifische Prozess ist wie folgt:

web.php-Datei

\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();
});
Nach dem Login kopieren

Code anzeigen
Wir müssen die Verschachtelung in Bezug auf Ansichten implementieren, da Benutzer immer mehr gegenseitig Kommentare abgeben. Daher müssen wir verschiedene Tricks anwenden Zeigen Sie den gesamten Kommentar hier an. Wir verwenden die Funktion @include(), um ihn anzuzeigen. Dann ist die Struktur unseres Versuchs wie folgt:

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

 - posts
show.blade.php
Nach dem Login kopieren

Der Code lautet wie folgt:
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>

Nach dem Login kopieren

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>
Nach dem Login kopieren

form.blade.php

Nach dem Login kopieren
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
Nach dem Login kopieren

Das endgültige Rendering ist wie folgt

Laravel5 implementiert die Form verschachtelter Kommentare (detaillierte Codeerklärung)

Das obige ist der detaillierte Inhalt vonLaravel5 implementiert die Form verschachtelter Kommentare (detaillierte Codeerklärung). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:segmentfault.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage