内容可以被贴上多个标签,保存内容与标签之间的关系用了一个中间表叫 post_tag,通过这个数据表我们可以把内容与标签拼接到一块儿,然后在里面选择自己需要的数据。比如可以在内容列表的内容项目里面添加一个跟这个内容相关的标签列表。
在 post.provider 里的 sqlFragment 里面,再添加一个查询片断,名字是 leftJoinTag,用一个字符模板。这个查询片断用 LEFT JOIN 先拼接一下 post_tag 数据表,条件是 post_tag 里的 posId 等于 post 表里的 id
下面还得继续拼接一下 tag 数据表,用 LEFT JOIN 拼接 tag 数据表,拼接的条件是 post_tag 里的 tagId 等于 tag 表里的 id 栏目的值。
继续再定义一个查询片断,名字叫 tags,它的值是个字符模板,先添加一个 CAST ,给栏目起个名字叫 tags,在 CAST 里面,把数据转换成 JSON 格式,用 AS JSON,然后在 AS JSON 的前面设置要转换的数据。
先用 IF 判断一下,判断的条件是 COUNT 一下 tag 的 id,如果没有标签,就用 NULL,如果有,可以用 CONCAT 连接几个东西。先是一个左边的方括号,最后是一个右边儿的方括号,中间可以再用 GROUP_CONCAT,组合连接,里面用 DISTINCT 去掉重复,连接的数据可以用 JSON_OBJECT 组织一个对象,里面有 id 属性,对应的值是 tag 里的 id,再添加一个 name 属性,对应的值是 tag 里的 name 。
下面再打开 post.service,修改一下在 getPosts 里准备的这段调取内容列表用的查询,在 SELECT 的下面,添加一个 sqlFragment 里的 tags,然后在这个 GROUP BY 的上面,再添加一个 sqlFragment 里的 leftJoinTag。
最后到 HTTP 客户端可以再测试一下,发送一下内容列表 请求,观察一下请求回来的数据。现在内容项目里会有一个 tags 属性,如果内容没有相关的标签,这个 tags 的值就会是 Null ,如果有相关的标签,tags 的值就是一组标签数据,每个标签项目里都有标签的 id 还有标签的名字。