评论的嵌套单表一对多关系-Symfony5全面开发

您需要登录后才可观看此视频

为了更好的为您提供服务,请您登录后再查看本课程。

立即登录 注册账号

我们希望评论有嵌套回复的功能,一条评论可以有一条父评论,也可以有多条子评论,那么它们在数据库中的关联关系是怎么样的呢?我们打开Comment类,如果一条评论它有一条父级评论,那么就需要在Comment类中添加一条属性,保存父级评论的信息。如果一条评论它有多条子评论,那么我们也需要在Comment类中添加一条属性,来保存所有的子评论信息。

我们打开底部控制台,新建一个控制台,输入symfony console make:entity来对Comment类进行修改。类名输入Comment,新的属性名称我们先输入parent,父评论属性,每个评论对象可能有一个父级评论对象,每个父级平的对象可以有多个子评论对象,这就是很典型的(自引用)多对一关系了。

输入ManyToOne,ManyToOne关系映射到Comment类中,Comment类的parent属性是否可以为空?我们这里设置为允许为空,如果一条评论的父级属性为空,那么这条评论就是顶级评论对象了,直接回车就可以了。

下面提示我们是否要添加一个属性,用来获取当前评论的所有子评论对象,我们允许。回车,新的属性名称,我们设置为$children。现在我们查看代码的更改,命令行在Comment类中添加了$parent属性和$children属性。现在属性就已经添加完成了。

我们直接回车退出命令行,它其实我们要创建一个数据迁移,我们复制命令行,粘贴命令行,命令行为我们生成了数据库迁移文件。查看一下文件,它在Comment表中添加了parent_id列,然后添加外键约束,我们直接执行数据库的更改,复制命令行,粘贴,回车。

回到文章详情页,我们希望在评论信息的后方有一个回复按钮,当点击回复按钮时,通过Ajax会在后台发送一个请求,传入父评论的信息和文章的信息,然后动态生成一个表单在页面上显示。

我们修改模板代码,打开show.html.twig文件,在comment.message后面我们添加一个按钮,button,添加一个链接样式的按钮,按钮的标签是回复。我们需要使用JS操作这个按钮添加一个样式类,然后我们在样式类按钮中添加一个data-parent-id属性,parent-id就是当前的comment的id,当我们点击回复按钮时,它会获取到父评论的id将父评论的id作为参数。

#templates/post/show.html.twig

<div class="media-body">
    <h5 class="mt-0">{{ comment.author }}</h5>
    {{ comment.message }}
    <button class="btn btn-sm btn-link js-replay-comment-btn" data-parent-id="{{ comment.id }}">回复</button>
</div>

在下一节我们将创建动态生成评论表单的controller方法,并且完成部分JS代码来动态的添加评论表单。

课程讨论

当前内容评论功能已关闭。