下面我们再处理一下内容列表,让它可以使用标签作为筛选条件,标签可以是一个或者多个,如果是多个标签,列出的内容列表里的项目就是包含任意标签的内容。
先打开 Post 控制器,找到里面的 index 方法,请求内容列表会使用这个方法来处理,这里我们用了之前自定义的一个装饰器 @ListOptions,用它装饰 options 的值,在这个 options 里面可以添加 tags 查询参数的值。
打开 ListOptionsInterface,在这个接口里添加一个 tags 属性,类型是 string。
然后再打开自定义的 @ListOptions 装饰器, 从地址查询参数里把 tags 解构出来,再去判断一下,如果 tags 有值,重新设置一下 tags 的值,用 tags 上的 split,按小横线把字符串分离成一个数组。
return 的值里面可以添加一个 tags 。
服务
再打开 Post 服务,找到里面的 index 方法, 在这个方法里,从 options 参数里面,把 tags 解构出来。
下面创建了一个 queryBuilder, 这里需要再添加一个 tags 关系,用一下 queryBuilder,leftJoinAndSelect,关系是 post 上的 tags,别名设置成 tag。
做一下判断,如果 options 的值里面有 tags。用 queryBuilder,andWhere,设置一个查询条件,条件是 tag 的 name 的值,IN ,在,括号 :...tags,第二个参数设置一下 tags 的值,这里就是 tags。
注意这里设置的条件用了 andWhere,也就是如果地址里面包含分类查询参数,同时又包含 tags 参数,列出的内容首先要是某个分类,然后再用指定的标签筛选这个分类内容列表。
测试
回到 HTTP 客户端试一下,请求 Post Index ,在请求的地址查询参数里,暂时先只添加一个 tags,它的值先设置成 山,发送一下这个请求。
得到的结果就是所有包含 山 这个标签的内容项目,这里找到了两个结果,因为它们关联的标签里面,都有名字是 山 的这个标签。
再回到数据库客户端,打开 tag 表, 在这里先手工添加一个新的标签,标签的 name 是日出,保存一下, 新创建的这个标签的 id 号是 3。
打开 post,找个内容项目给它打上刚才创建的标签, 比如让 id 号是 4 的这个内容项目,关联一个名字是 日出的 标签。
在 post_tags_tag 表里手工设置一下,postId 是 4 ,tagId 是 3。
然后回到 HTTP 客户端,在 tags 这个地址查询参数,添加一个小横线,日出,重新发送一下这个请求。
这次找到了三个结果,这几个内容项目都关联了 山,或者 日出 标签。