Maison > cadre php > Laravel > Laravel5 implémente la forme de commentaires imbriqués (explication détaillée du code)

Laravel5 implémente la forme de commentaires imbriqués (explication détaillée du code)

不言
Libérer: 2018-12-21 09:52:14
avant
3529 Les gens l'ont consulté

Le contenu de cet article concerne l'implémentation des commentaires imbriqués dans Laravel5 (explication détaillée du code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Nous voyons souvent des commentaires affichés sous de nombreuses formes, comme '@' untel, ou des commentaires contractés comme Zhihu, ou des commentaires imbriqués, donc la première chose est Le plus courant est imbriqué commentaires, car ils sont plus accrocheurs.

Travail de préparation

1. Concevoir trois tableaux : utilisateurs, publications, commentaires, tableau. suit :

utilisateurs

Schema::create('users', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->string('email')->unique();
    $table->string('password');
    $table->rememberToken();
    $table->timestamps();
});
Copier après la connexion

posts

Schema::create('posts', function (Blueprint $table) {
    $table->increments('id');
    $table->string('title');
    $table->integer('user_id')->index();
    $table->text('content');
    $table->timestamps();
});
Copier après la connexion

commentaires

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();
});
Copier après la connexion

2. Couche modèle :
Fichier Post.php

/**
 * 一篇文章有多个评论
 * @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');
}
Copier après la connexion

Fichier Comments.php

/**
 * 这个评论的所属用户
 * @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');
}
Copier après la connexion

Écriture logique
Les commentaires imbriqués que nous voulons implémenter ont en fait quelques idées dans notre travail de préparation Maintenant, nous affichons d'abord un article, et en même temps utilisons la relation un-à-plusieurs entre l'article et les commentaires pour afficher tous les commentaires. Cependant, nos commentaires impliquent un champ appelé parent_id. Ce champ est en fait très spécial. ce champ à regrouper, le code est le retour ci-dessus $this->comments()->with('owner')->get()->groupBy('parent_id'), le processus spécifique est le suivant :

fichier web.php

\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();
});
Copier après la connexion

Code de visualisation
Nous devons implémenter l'imbrication dans les vues, afin que les utilisateurs commentent de plus en plus les uns les autres, puis Plus il y a de niveaux imbriqués, nous devons donc utiliser diverses astuces pour afficher l'intégralité du commentaire. Nous utilisons la fonction @include() pour l'afficher. Ensuite, la structure que nous essayons est la suivante :

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

 - posts
show.blade.php
Copier après la connexion
Le code est le suivant :

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>

Copier après la connexion
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>
Copier après la connexion
form.blade.php

Copier après la connexion
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
Copier après la connexion
Le rendu final est le suivant


Laravel5 implémente la forme de commentaires imbriqués (explication détaillée du code)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:segmentfault.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal