我使用typeorm,在querybuilder中使用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();