typeorm leftjoin remove parent results

问题描述 投票:0回答:1

我使用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();

'''

左连接应该返回所有用户和匹配的设备(据我所知).为什么会发生这种情况?

node.js typeorm
1个回答
0
投票

这里的问题是你的查询,你可能认为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();
© www.soinside.com 2019 - 2024. All rights reserved.