先用 HTTP 客户端请求一下内容列表,现在我想在返回的内容列表里包含内容的分类,回到项目,打开 PostService,找到查询内容列表的方法,就是这个 index。
在给 find 方法的 relations 里面,除了 user 关系,可以再添加一个 category, 然后再回到 HTTP 客户端试一下,重新发送一下这个内容列表请求。
这次返回的内容列表里会包含一个 category 属性,它的值就是内容所属的分类,如果内容项目没有分类,category 的值会是 Null。
按分类筛选
在 posts 地址里可以添加一个查询参数,名字可以是 categories,它的值可以是分类的别名,使用这种方法筛选一下内容列表,只返回指定分类的内容列表,下面再去实现一下这个功能。
先打开 PostController ,找到里面的 index 方法, 在方法里,用一下 @Query 这个装饰器,给它一个 categories 参数 ,用它装饰的参数名字叫 categories,类型是 string。
再把这个参数的值交给 postService 的 index 方法。
打开 postService ,找到 index 方法,让方法接收一个 categories 参数,类型是 string。
方法里面查询数据用的方法可以换成在使用 Query Builder。新建一个 queryBuilder,await,用一下 this.postRepository,createQueryBuilder,给它一个别名,叫 post。
先处理内容需要的两个关系,用一下 queryBuilder ,leftJoinAndSelect,关系是 post 上的 user,别名设置成 user。
下面再用同样的方法,queryBuilder.leftJoinAndSelect,关系是 post 上的 category,别名是 category。
然后可以再去做一下判断,如果 categories 参数有值。
可以再执行 queryBuilder,用一下 where 设置一个查询条件,条件是 category.alias 等于,:categories 参数,这个 :categories 的意思是这里需要一个叫 categories 的参数,它的值要在 where 方法的第二个参数里设置一下, 添加一个 categories,对应的值是 index 方法的 categories 参数的值。
下面添加一个 entities,用一下 queryBuilder 上的 getMany。
最后返回查询出来的这组 Post 实体。
再回到 HTTP 客户端发送一下这个请求,这回返回的就是别名是 landscape 的分类的内容列表。
现在应用里只有一个内容项目属于这个分类。
回到数据库客户端,打开 post 表,可以手工设置一条 post 记录的分类 id ,设置成 1。
重新发送一下这个请求,这回会返回两条内容。
换一个分类别名,emotion,发送一下请求,还没有内容属于这个分类。
回到数据库客户端,找一个数据记录,让它的 categoryId 的值等于 2 ,这个就是 emotion 分类的 id 号。
再重新发送一下这个请求,返回的结果里面会包含一个内容项目,因为这个内容所属的分类别名是 emotion。
去掉地址里的 categories 查询参数,发送一下请求, 这次会返回所有的内容项目。