资讯专栏INFORMATION COLUMN

Laravel 5~嵌套评论的实现

ethernet / 1164人阅读

摘要:经常我们看见评论显示形式有很多,比如某某,又或者像知乎的收缩式的评论,又或者是嵌套式的评论,那么最一开始也是最常见的就是嵌套式评论,因为这个更加醒目准备工作设计三张表,表结构如下层文件一篇文章有

经常我们看见评论显示形式有很多,比如"@"某某,又或者像知乎的收缩式的评论,又或者是嵌套式的评论,那么最一开始也是最常见的就是嵌套式评论,因为这个更加醒目.

准备工作
1.设计三张表users,posts,comments,表结构如下:

users

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();
});

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();
});

2.Model层:
Post.php文件

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

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

Comments.php文件

/**
 * 这个评论的所属用户
 * @return IlluminateDatabaseEloquentRelationsBelongsTo
 */
public function owner()
{
    return $this->belongsTo(User::class, "user_id");
}

/**
 * 这个评论的子评论
 * @return IlluminateDatabaseEloquentRelationsHasMany
 */
public function replies()
{
    return $this->hasMany(Comment::class, "parent_id");
}

逻辑编写
我们所要实现的嵌套评论其实在我们准备工作中已经 有点思路了,我们首先将一篇文章显示出来,同时利用文章与评论的一对多关系,进行显示所有的评论,但是我们的评论里面涉及到一个字段就是parent_id,这个字段其实非常的特殊,我们利用这个字段来进行分组, 代码就是上面的return $this->comments()->with("owner")->get()->groupBy("parent_id"),具体的过程如下:

web.php文件

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

//显示文章和相应的评论
Route::get("/post/show/{post}", function (AppPost $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 (AppPost $post) {
    $post->comments()->create([
        "body" => request("body"),
        "user_id" => Auth::id(),
        "parent_id" => request("parent_id", null),
    ]);
    return back();
});

视图代码
视图方面我们需要实现嵌套,那么随着用户互相评论的越来越多的话,那么嵌套的层级也就越多,所以说,我们这里需要使用各小技巧来显示整个评论,我们使用@include()函数来显示,那么我们试图的结构如下:

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

 - posts
show.blade.php

代码如下:
show.blade.php




    
    
    
    


{{$post->title}}

{{$post->content}}


@include("comments.list",["collections"=>$comments["root"]])

留下您的评论

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

comment.blade.php

{{$comment->owner->name}}:
{{$comment->body}}
@include("comments.form",["parentId"=>$comment->id]) @if(isset($comments[$comment->id])) @include("comments.list",["collections"=>$comments[$comment->id]]) @endif

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

最终效果图如下

最近在研究laravel,看到一个之前做过的功能,之前写的比较繁琐,特记录下来。
摘自:
https://laravel-china.org/art...
https://laravel-china.org/art...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29840.html

相关文章

  • 使用 Baum 嵌套集合模型来实现 Laravel 模型无限极分类

    摘要:本文经授权转自社区使用嵌套集合模型来实现模型的无限极分类说明大家通常都是使用递归实现无限极分类,都知道递归效率很低,下面推荐一个的扩展包,快速让你的数据模型支持无限极树状层级结构,并且兼顾效率。 本文经授权转自 PHPHub 社区 使用 Baum 嵌套集合模型来实现 Laravel 模型的无限极分类 说明 大家通常都是使用递归实现无限极分类,都知道递归效率很低,下面推荐一个 Larav...

    superPershing 评论0 收藏0
  • 个人整理, 阅读过好文章 (每天随时更新)

    摘要:大家有好的文章可以在评论下面分享出来共同进步本文链接数组使用之道程序员进阶学习书籍参考指南教你在不使用框架的情况下也能写出现代化代码巧用数组函数框架中间件实现没错,这就是面向对象编程设计模式需要遵循的个基本原则令人困惑的在中使用协程实现多任 大家有好的文章,可以在评论下面分享出来, 共同进步! 本文github链接 php PHP 数组使用之道 PHP程序员进阶学习书籍参考指南 教你...

    Chiclaim 评论0 收藏0
  • laravel package收集

    摘要:查找保存下载用搭建自己的缓存仓库权限管理的好选择基于封装的后台管理系统,支持手机和端访问支付宝风格的验证器后台系统微信接口的部署脚本开发的博客系统百度推送自动记录用户行为扩展一个项目管理系统根据生成对应导航的状态 1.debug https://github.com/barryvdh/l... showImg(https://segmentfault.com/img/bVmhWL); ...

    psychola 评论0 收藏0
  • Laravel 5.4 入门系列 8. 文章评论

    摘要:编辑迁移文件我们为表格添加了外键,同时生定义了约束,该约束允许删除父表文章的时候,自动删除关联的子表评论。关联中文文档的辅助函数列表中文文档 本节将学习 Eloquent Relations,表与表之间存在着多种关系,举例如下: 一对一:文章与作者 一对多:文章与评论 多对多:标签与文章 文章与评论的一对多关系 一对多关系,主要理解两点: 如何实现一对多关系 实现了之后能给开发带...

    IntMain 评论0 收藏0
  • Laravel 5.4 入门系列 9. 注册与登录,用户关联

    摘要:本节将实现文章评论与用户关联的功能。关系定义首先修改与表,增加字段增加全部回滚并重新执行迁移添加用户表与文章表评论表的一对多关系添加文章评论表与用户表的多对一关系同时,评论表的字段增加。同时,我们还自定义了返回的错误信息。 本节将实现文章、评论与用户关联的功能。 关系定义 首先修改 posts 与 comments 表,增加 user_id 字段 /database/migratio...

    smallStone 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<