node.js - typeorm leftjoin 删除父结果
问题描述
我正在使用 typeorm,在查询构建器中使用 leftjoin 命令时,它似乎删除了父结果:'''
var user = await getRepository(Users).createQueryBuilder("user")
.where("user.user_id = :user_id", { user_id: user_id })
.andWhere("user.token = :u_token", { u_token: u_token })
.leftJoinAndSelect("user.devices", "device")
.where("device.token = :d_token", { d_token: d_token })
.andWhere("device.code_tries <= 3")
.andWhere("device.status = 0")
.getMany();
''' 仅当存在有效设备时才会返回用户,如果未找到设备则不会返回“用户”。
顺便说一句,通过删除所有“leftjoin”部分,无论如何都会返回用户对象。像这样: '''
var user = await getRepository(Users).createQueryBuilder("user")
.where("user.user_id = :user_id", { user_id: user_id })
.andWhere("user.token = :u_token", { u_token: u_token })
.getMany();
'''
左连接应该返回所有用户和匹配的设备(据我所知)。为什么会这样?
解决方案
这里的问题是您的查询,您可能认为 leftJoinAndSelect 之后的 where 子句仅适用于设备,但实际上与此相同:
var user = await getRepository(Users).createQueryBuilder("user")
.leftJoinAndSelect("user.devices", "device")
.where("user.user_id = :user_id", { user_id: user_id })
.andWhere("user.token = :u_token", { u_token: u_token })
.where("device.token = :d_token", { d_token: d_token })
.andWhere("device.code_tries <= 3")
.andWhere("device.status = 0")
.getMany();
您需要的是子查询之类的东西,实现这一目标的一种方法是使用 leftJoinAndMapMany:
const query = getRepository(Users).createQueryBuilder("user")
.leftJoinAndSelect("user.devices", "device")
where("user.user_id = :user_id", { user_id: user_id });
const condition = 'device.token = :d_token && device.code_tries <= 3 && device.status = 0';
query.leftJoinAndMapMany('user.devices', Device, 'device', condition, {
d_token: d_token
});
user = await query.getMany();
推荐阅读
- android - Android 活动堆栈(BaseActivity)
- java - getElementsAnnotatedWith 方法在注释处理时返回空列表
- hugo - 单页添加到“单页”网站不起作用
- html - 在 Visual Studio Code 中更改匹配标签的文本装饰样式
- spring - Java spring OAuth2客户端(资源服务器)总是返回'invalid token'错误
- c# - 需要一个映射类来解析新添加的字段
- angular - 如何在运行时更改 Angular Material Datepicker monthYearLabel 格式
- java - 有没有办法避免这个“属性值必须是常数”的错误?
- c# - 如何在c#中设置WPF的位置
- memory - CPU物理地址空间如何映射到物理DRAM?