之前我们在应用里定义过单个用户接口,它返回的是用户相关的数据,下面可以修改一下这个接口,添加一个 avatar 属性,表示用户是否拥有头像数据,如果用户之前上传过头像,avatar 的值是 1,如果没上传过头像,avatar 的值可以是 null。这样在客户端应用那里,可以根据 avatar 的值,准备好要显示的用户头像。
UserEntity
打开 UserEntity,在这个用户实体里面,描述一下用户与头像之间的关系,定义一个 OneToMany 的关系,关系返回的东西是 AvatarEntity,在 avatar 那边儿,对应的关系是 avatar 里的 user。属性的名字是 avatar,值的类型是 Array
GetUserQuery 处理器
打开 GetUserQuery 这个查询的处理器,修改一下 execute 方法里的东西,给这个用 queryBuilder 查询出来的数据起个名字叫 user 。最后可以返回这个 user。
在上面可以判断一下,如果 !user.id ,意思就是如果查询出来的数据,id 没有值,说明用户不存在,这种情况可以 throw 一个异常,新建一个 NotFoundException,异常信息是没找到用户。
这个查询也得再改一下,使用一个 leftJoin 合并一下 user.avatar ,别名设置成 avatar ,在上面再用一个 addSelect 添加一个新的字段,用 IF 判断一下 COUNT avatar.id 的结果,如果是真的就返回 1 ,是假的就返回 NULL,给这个字段起个名字叫 avatar。最后这个 getOne 要换成 getRawOne,因为现在查询出来的东西并不是 User 实体。
选择的字段需要起个名字,这个 user.id 可以叫 id,user.name 设置成 name。
测试
在 Http 客户端测试一下,打开单个用户请求,修改一下请求地址里的 userId 参数的值,设置成一个在数据库里不存在的用户,发送一下请求,会得到一个异常响应,提示用户不存在。
修改一下 userId,换成一个存在的用户的 id,发送一下这个请求,这回响应的数据里面会包含 avatar 属性,因为这个用户之前设置成头像,所以这个 avatar 的值是 1 。再换一个 userId ,重新发送一下请求,这个用户没有上传过头像,所以 avatar 的值会是 null 。