首页 > 解决方案 > 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();

'''

左连接应该返回所有用户和匹配的设备(据我所知)。为什么会这样?

标签: node.jstypeorm

解决方案


这里的问题是您的查询,您可能认为 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();

推荐阅读