Maison  >  Article  >  cadre php  >  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)

不言
不言avant
2018-12-21 09:52:143466parcourir

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.php
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>

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


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
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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer