现在我们的评论列表可以过滤出某个用户的回复评论列表,在这个列表的评论数据项目里面,可以加上被回复的评论相关的数据。先去定义一个查询片断,打开 comment.provider,在这个文件里的 sqlFragment 里面,再添加一个查询片断,名字是 repliedComment。
用一个子查询可以组织一个评论对象,给结果起个名字叫 repliedComment,表示被回复的评论。 在这个子查询里面,用 SELECT ,然后用 JSON_OBJECT 组织一个对象,里面有 id 属性,对应的值是 repliedComment 里的 id 栏目的值,再添加一个 content 属性,对应的值是 repliedComment 里的 content。
在 FROM 的后面设置数据来源,这里就是 comment 数据表,不过要给它起个别名,可以叫它 repliedComment。这样才能在 SELECT 语句里面使用 repliedComment 这个表里的东西。
然后用 WHERE 设置一个条件,条件就是 comment 表里的 parentId 等于 repliedComment 表的 id 栏目的值。
再打开 comment.service,找到在这里定义的 getComments,修改一下在这个函数里准备的这段查询。
在 SELECT 语句的下面,先判断一个条件再决定是不是要加上 repliedComment 这个查询片断,判断的条件就是检查 filter 的 name 是不是等于 userReplied ,如果是,就在这段查询里加上 sqlFragment 里的 repliedComment 这个查询片断。它会在查询结果里加入被回复的评论相关的数据。
在 HTTP 客户端测试一下,打开 评论列表 请求,地址是 /comments?user=3&action=replied 发送一下这个请求。观察一下请求回来的评论数据。你会发现在数据项目里会出现一个 repliedComment,它的值就是当前这条评论回复的那条评论。
这个被回复的评论的 id 是 4, 当前这条评论的 id 是 6 。 在数据库客户端可以再验证一下,找到 id=6 的这条评论数据, 你会发现它的 parentId 的值是 4,也就是 id=6 的这条评论,回复的就是 id=4 的这条评论。
再试一下,把请求地址里的 action 的值换成 published,这样会找出这个用户发表的评论,在结果里不会包含 repliedComment 属性。
只有在请求得到用户回复的时候,才会在评论数据项目里出现这个 repliedComment 属性 。