Golang实现多级评论以及通过递归删除评论、子孙评论功能(Gorm的自引用)

文章描述了一个使用Golang和GORM库构建的评论系统,包括添加评论、删除评论及其子孙评论的功能。删除评论时,通过递归算法查找并删除所有子孙评论,同时更新评论数。涉及到的数据库操作包括查询、更新和删除。

需求分析

使用golang及gorm制作一个用户的评论以及回复评论,同时删除评论后评论数通过递归查询所有的子孙评论发生改变

实现思路

在前端传来用户的数据,即我评论了哪个楼主,我上一级的评论是谁,
评论:先判断是否存在楼主,其次判断是否存在父级评论,之后添加评论,最后增加评论数,储存数据库
删除评论:获取删除评论的楼主树洞,判断是否是本人或者楼主删除评论,判断是否又该评论的父级评论,通过递归算法查询所有的子孙评论,删除子孙评论,评论数减少,最后存入数据库。(在递归中,要查找子评论的子评论,同时删除子评论,减少评论数)

实现代码

递归删除所有的评论的子孙评论

//递归删除所有评论的子评论
func DeleteCommentAndReplays(comment *model.TreeHoleComment) (err error) {
   
   
	comment, err = mysql.GetTreeHoleCommentByID(int(comment.ID))
	if err != nil {
   
   
		zap.L().Error("数据库查询回复失败", zap.Error(err))
		return err
	}
	for _, replay := range comment.CommentReplays {
   
   
		err := DeleteCommentAndReplays(replay)       //此处递归
		if err != nil {
   
   
			zap.L().Error("递归查询评论失败", zap.Error(err))
			return err
		}
		//删除评论
		err = mysql.DeleteTreeHoleComment(int(replay.ID))
		if err != nil {
   
   
			zap.L().Error("删除评论失败", zap.Error(err))
			return err
		}
		//查询顶部树洞
		treeHoleByID, err := mysql.GetTreeHoleByID(int(comment.TreeHoleID))
		if err != nil {
   
   
			zap.L().Error("通过id查询树洞错误", zap.Error(err))
			return err
		}
		treeHoleByID.CommentNum--
		//存数据库
		err = mysql.UpdateTreeHole(treeHoleByID)
		if err != nil {
   
   
			zap.L().Error("数据库更新树洞失败", zap.Error(err))
			return err
		}
	}
	return nil
}

结构体

//树洞结构体
type TreeHole struct {
   
   
	gorm.Model
	User        User
	UserID      uint              `json:"userID"`           //用户ID
	Content     string            `json:"content"`          //树洞内容
	LikeNum     uint 
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值