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(); });
posts
Schema::create('posts', function (Blueprint $table) { $table->increments('id'); $table->string('title'); $table->integer('user_id')->index(); $table->text('content'); $table->timestamps(); });
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(); });
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'); }
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'); }
É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(); });
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.phpLe 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>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>form.blade.php list.blade.php
@foreach($collections as $comment) @include('comments.comment',['comment'=>$comment]) @endforeachLe rendu final est le suivant
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!